나는 Chequing_Account 테이블 (예산, iban 번호 및 계정의 다른 세부 정보가 포함되어 있음)이 0, 1 또는 많은 chequing 계정을 가질 수있는 두 개의 다른 테이블 Person 및 Corporation과 관련되어야하는 상황을 모델링해야합니다.
다시 말해서 나는 같은 테이블과 두 개의 일대 다 관계가 있습니다.
정규화 요구 사항을 존중하는이 문제에 대한 해결책을 듣고 싶습니다. 내가 들었던 대부분의 솔루션은 다음과 같습니다.
1) Person과 Corporation이 속한 공통 엔티티를 찾고이 테이블과 Chequing_Account 테이블 사이에 링크 테이블을 작성하십시오.이 경우에는 불가능하며 일반적인 문제는 해결하고 싶지만이 특정 인스턴스는 아닙니다.
2) 두 엔티티를 Chequing 계정과 연관시키는 PersonToChequingAccount 및 CorporationToChequingAccount 링크 테이블을 두 개 작성하십시오. 그러나 나는 두 사람이 같은 chequing 계정을 갖기를 원하지 않으며 자연인과 회사가 chequing 계정을 공유하기를 원하지 않습니다! 이 이미지를보십시오
3) 회사 및 자연인을 가리키는 Chequing Account에 두 개의 외래 키를 작성하십시오. 그러나 개인과 회사가 많은 Chequing 계정을 가질 수 있도록 강요하지만 각 ChequingAccount 행마다 두 관계가 모두 일치하지 않도록 수동으로 확인해야합니다 체킹 계정이 법인 또는 자연인이기 때문에 법인 및 자연인. 이 이미지를보십시오
이 문제에 대한 다른 깨끗한 해결책이 있습니까?
CHECK (CorporationID IS NOT NULL AND NaturalPersonID IS NULL OR CorporationID IS NULL AND NaturalPersonID IS NOT NULL)
솔루션 1을 선호하지만 그저 나뿐입니다. 훨씬 "더 깨끗하다".
ChecquingAccount
테이블에 OwnerTypeID=1
및 OwnerID=123
의 유형을 나타내는 레코드를 가질 수 있으므로 테이블의 Corporation
ID 123
를 가질 수 있습니다 Corporation
. OwnerTypeID는 어떤 테이블을 알려주고 OwnerID는 그 테이블의 ID를 알려줍니다.
Customers
테이블 이라고 부릅니다 .
OwnerTypeID
에ChecquingAccount
로, 테이블1=Corporation
및2=NaturalPerson
? 그런 식으로 테이블OwnerID
에 하나만 있으면ChecquingAccount
,와 함께 색인을 생성 할 수 있습니다OwnerTypeID
.