문제

임시 데이터베이스의 날짜는 하나 또는 2 개의 테이블에 저장되어야합니까? 이것이 정규화를 위반하지 않으면?

PERSON1 DATE11 DATE21 INFO11 INFO21 DEPRECATED
PERSON2 DATE21 DATE22 INFO21 INFO22 CURRENT
PERSON1 DATE31 DATE32 INFO31 INFO32 CURRENT

날짜 1 및 날짜 2 열은 date1과 date2 사이의 기간에 대해 info1과 info2가 참임을 나타냅니다. 날짜 <오늘 <면 사실은 더 이상 사용되지 않으며 사용자 인터페이스에 더 이상 표시되지 않아야하지만 역사적 목적으로 삭제해서는 안됩니다. 예를 들어 Info11 및 Info21은 이제 더 이상 사용되지 않습니다.

이 테이블을 분할해야합니까? 테이블에 상태 (감가 상승 또는 전류)를 저장해야합니까?

질문을 더 명확히하려면 비즈니스가 사용하는 용어입니다. "현재가 아닌"선호하는 경우 문제는 의미가 아니며 SQL 쿼리에 관한 것이 아닙니다. 단지 어떤 디자인이 정규화 규칙을 위반하거나 가장 적합한 지 알고 싶습니다. (나는 정상화가 항상 갈 길이 아니라는 것을 알고 있습니다. 그것은 내 질문이 아닙니다).

도움이 되었습니까?

해결책

"어떤 디자인이 정규화 규칙을 위반하는지 알고 싶습니다."

가고 싶은 정규화 규칙 세트에 따라 다릅니다.

정상적인 형태의 첫 번째이자 가장 큰 위반 및 날짜의 책 위반입니다 첫 번째 NF, "현재"정보를 보유하는 행의 최종 날짜 (미래 날짜 정보의 가능성을 추상화 함) : 해당 속성을 무효화 할 수있는 경우 1NF를 위반합니다.

위반 BCNF 키를 선택한 결과로 분명히 발생할 수 있습니다 (비 시간 데이터베이스 설계도 마찬가지입니다. 시간적 측면은 여기서 차이가 없습니다). WRT "Keys of Keys": 별도의 시작 및 종료 날짜 (및 SQL 종류의 다른 선택은 남기는 경우)를 사용하는 경우, 시작 날짜가 포함 된 두 개의 키를 선언해야 할 가능성이 높습니다. 종말.

또 다른 설계 문제는 여러 데이터 열입니다. 이 문제는 "시간적 데이터와 관계형 모델"에서 상당히 많이 논의됩니다. Info1과 Info2가 서로 독립적으로 변경 될 수 있다면 "폭발을 피하기 위해 테이블을 하나의 속성 만 고정하도록 분해하는 것이 더 나을 수 있습니다. 행의 단일 속성이 변경 될 때마다 새 완전 행을 만들어야하는 경우 행이 발생할 수 있습니다. 이 경우, 당신이 제공 한 당신의 디자인은 "시간적 데이터와 관계형 모델"에 정의 된 (정상 형태)와 같이 여섯 번째 정상 형태의 위반을 구성합니다.

다른 팁

정규화는 관계형 데이터베이스 개념입니다. 시간 데이터베이스에는 적용되지 않습니다. 그것은 당신이 관계형 데이터베이스에 시간 데이터를 저장할 수 없다고 말하는 것은 아닙니다. 당신은 확실히 할 수 있습니다.

그러나 시간적 데이터베이스 설계를 사용하는 경우 시간 정규화의 개념은 관계형 정규화보다는 적용됩니다.

날짜의 의미를 표시하지 않았습니다. 그들은 (a) 명시된 사실이 실제 생활에서 사실이었던 기간, 또는 (b) 명시된 사실이 사실이라고 믿었습니다 데이터베이스의 소지자에 의해? 만약 (b), 나는 결코 이런 식으로하지 않을 것입니다. 업데이트가 완료되면 즉시 업데이트 된 라인을 아카이브 테이블/로그로 이동하십시오. (a)이면 다음 진술은 의심 스럽다.

"사실은 더 이상 사용되지 않으며 사용자 인터페이스에 더 이상 표시되지 않아야합니다."

사실이 더 이상 "사용자 인터페이스에 표시 될 필요가 없다면"더 이상 데이터베이스에있을 필요가 없습니다. 그러한 사실을 유지하면 한 가지만 달성합니다. 나머지 모든 사람들의 일반적인 성능을 악화시킵니다.

당신이 당신의 요구 사항에 맞게 이러한 역사적 사실을 실제로 필요로한다면, 소위 "감가 상각 된 사실"이 여전히 비즈니스와 매우 관련이 있으므로 전혀 "감가 상각 된"것이 아닙니다. 이러한 이유로 데이터베이스에 "진정한 감가 상각 된"사실이 거의 없다고 가정하면 디자인이 좋습니다. 운영 데이터베이스에서 주기적으로 제거하여 "진정으로 더 이상 사용되지 않은 사실"의 수를 작게 유지하십시오.

(PS) 디자인이 좋다고 말하는 것이 문제가 발생하지 않는다는 의미는 아닙니다. SQL은 이러한 종류의 정보를 우아하게 처리하기에 매우 적합합니다. "시간적 데이터와 관계형 모델"은 주제에 대한 훌륭한 처리입니다. Snodgrass의 또 다른 책은 나에게는 그렇지는 않지만 종종 칭찬을받습니다. 이 책에 대한 다음과 같은 대화에서 입증 된 바와 같이, SQL에서 이러한 문제를 다루기위한 요리법이있는 요리 책입니다.

(Q) "왜 내가 읽을까요?" (a) "당신이 요청한 트리거는 135 페이지에 있기 때문에"

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top