이 테이블을 무손실로 분해 할 수 있습니까?


10

나는 내 리그에서 벗어난 데이터베이스 디자인 문제를 우연히 발견했으며 DBA 전문가는 소방 훈련을 시작했습니다.

본질적으로, 나는 다음과 같은 기본 키 (간결하게 PK)가있는 테이블이 있습니다.

child_id   integer
parent_id  integer
date       datetime

child_idparent_id엔티티 테이블에 대한 외래 키입니다. "자식"테이블 자체에는 "부모"테이블에 대한 외래 키도 포함되어 있으며, lo는 child_id항상 parent_id위의 테이블에서 예상 한 것과 동일 하게 참조 됩니다. 사실, 두 코드를 동기화시키는 여분의 코드가 있다는 것이 밝혀졌습니다.

이 과도한 열정적 인 정규화 초보자는 "이중화를 대신 제거해야합니다!"라고 말합니다.

나는 다음과 같이 분해한다.

Table_1 PK:
child_id   integer
date       datetime

Table_2 PK:
parent_id  integer
date       datetime

Table_3: (already exists)
child_id   integer PRIMARY KEY
parent_id  integer FOREIGN KEY

그리고이 사람들을 자연스럽게 합치면 원래의 테이블을 복구합니다. 이 5NF를 만드는 것은 내 이해입니다.

그러나 이제 숨겨진 비즈니스 규칙이 있음을 알고 있습니다.

일반적으로 주어진 날짜와 관련된 날짜는 해당와 관련된 날짜 child_id의 하위 집합이어야합니다 parent_id. 첫 번째 테이블이이 규칙을 적용 함을 알 수 있습니다.

날짜가 너무 커질 때까지 표 1에 자유롭게 추가 할 수 있기 때문에 분해시 규칙이 적용되지 않습니다.

다음 질문과 함께 여기로 연결됩니다.

  1. 이 분해가 5NF입니까? 삽입 예외가 허용되지만 Wiki 예제를 따르는 것 같습니다. 예제는 자체적 으로이 가이드를 따릅니다 . "강조 광산"이라는 문구는 " 세 가지 별도의 레코드 유형으로 구성된 정규화 된 양식에서 모든 실제 사실을 재구성 할 수 있습니다"라는 문구 는 특별한 일시 중지를 제공 Table_1합니다.

  2. 이 분해가 마음에 들지 않는다고 가정합니다. 실용적인 해결책은 테이블과 코드를 그대로 두는 것입니다. 그러나 이론적으로, 내가 첫 번째 테이블에서 멀리 얻을 수 있도록 및 분해 / 또는 제약 조건을 추가 할 수있는 방법이 내 비즈니스 규칙을 보존은?


1
원래 테이블의 키는 무엇입니까? 어떤 의존성을 만족시켜야합니까? child_id-> parent_id (이 경우 child_id 및 parent_id는 모두 해당 테이블에서 동일한 키의 일부가 될 수 없음)라고 말하는 것 같습니다.
nvogel 2016 년

1
@trevor : 여기서 답을 검토 한 적이 있습니까? 요청한 지 19 분이 지났습니다. 답은 나중에왔다.
gbn 12

답변:


9

정규화는 기능적 종속성을 기반으로합니다. 기능적 의존성은 시맨틱과 관련이있다. 데이터의 의미와 관련이 있습니다. 실제 문제를 "parent_id, child_id, date"수준으로 단순화하고 샘플 데이터를 포함하지 않으면 양심적 인 데이터베이스 디자이너가 제공 할 수있는 도움이 실제로 제한됩니다.

하나의 테이블에 {child_id, parent_id, date} 키가 있고 자식 테이블에 고유 한 쌍 {child_id, parent_id}이 있다고해서 반드시 조합의 일부가 중복되는 것은 아닙니다 . 이는 {child_id, parent_id, date}가 기본 키인 테이블에서 속성 쌍 {child_id, parent_id}가 먼저 자식 테이블을 참조해야 함을 의미 할 수 있습니다.

이 경우을 사용할 수 있습니다 FOREIGN KEY (child_id, parent_id) REFERENCES child (child_id, parent_id). 이를 위해서는 "child"테이블의 열 쌍 (child_id, parent_id)에 대한 UNIQUE 제약 조건이 필요합니다. 이는 child_id가 기본 키인 경우 문제가되지 않습니다.

그러나 데이터의 의미를 모른 채 말할 방법이 없으며이 스레드에서이를 아는 유일한 사람입니다. (하지만 설명해 드리겠습니다.)

원래 테이블과 관련하여 child_id-> parent_id라고 말하는 것 같습니다. 그렇다면 왜 원래 테이블의 parent_id가 처음입니까? "child"테이블에 대한 외래 키 참조를 가진 키가 왜 (child_id, date) 아닌가? "parent_id"열을 삭제하면 해결할 수있는 중복 유형처럼 보입니다.

INSERT 문 형태의 SQL DDL 및 샘플 데이터가 도움이됩니다. DDL 및 INSERT 문은 설명보다 정확합니다.


1
"기능 의존성"리마인더 +2
jcolebrand

3

이 시도...

  • (child_id,parent_id)자식 테이블에 고유 제약 조건 추가
  • 현재 테이블 (PK,FK:child_id, PK,FK:parent_id, PK:date)은 그대로 유지되고 FK는 새로운 고유 제약 조건의 2 열에 있습니다.

또는

  • 현재 자식 테이블에서 FK 제거
  • (PK,FK:child_id, FK:parent_id)자식과 1 : 1 인 새 테이블 을 만듭니다.
  • 현재 테이블 (PK,FK: child_id, PK,FK: parent_id, PK:date)은 그대로 유지됩니다. FK는 새 테이블의 두 열에 있습니다.

다른 것이 없다면 영감을 줄 수 있습니다 ...

올바르게 이해하면 중복성과 코드가 제거됩니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.