나는 것 자체로 사람의 테이블을 연결하는 링크 테이블에서만 알려진 관계를 문서화하는 경우 각 관계 유형에 대한 몇 가지 그 테이블에 적절한 제약 조건 (또는 여러 테이블로
FK Person1ID
FK Person2ID
RelationshipTypeID (Sibling, Father, Mother, Step-Father, Step-Mother, etc.)
, 하나를
(반 형제는 하나의 부모 만 공유 함) 예외 유추를 실행하여 유추 할 수 있지만 누락 된 경우이를 만들 수 있습니다. 모든 부모가 확인이없는 형제가
예를 들어
, 명 :
SELECT *
FROM People p1
INNER JOIN Relationship r_sibling
ON r_sibling.Person1ID = p1.PersonID
AND r_sibling.RelationshipType = SIBLING_TYPE_CONSTANT
INNER JOIN People p2
ON r_sibling.Person2ID = p2.PersonID
WHERE EXISTS (
-- p1 has a father
SELECT *
FROM Relationship r_father
ON r_father.RelationshipType = FATHER_TYPE_CONSTANT
AND r_father.Person2ID = p1.PersonID
)
AND NOT EXISTS (
-- p2 (p1's sibling) doesn't have a father yet
SELECT *
FROM Relationship r_father
ON r_father.RelationshipType = FATHER_TYPE_CONSTANT
AND r_father.Person2ID = p2.PersonID
)
당신은 형제 자매가 항상 (당신이 당신의 관계를 제약하려는 방법에 따라 UNION이 쿼리의 역을해야 할 수도 있습니다 교환 적, 다른 관계와는 달리).
그건 나에게 아이디어를주지. 어쩌면 ID로만 구성된 "실존 적 사람"테이블을 가질 수 있습니다. 그런 다음 우리가 알고있는 데이터를 포함하는 다른 사람의 테이블. 이것은 개인 프로젝트이므로 너무 학문적이지도 신경 쓰이지 않습니다. –
다른 테이블은 나쁜 생각입니다. FamilyTree 테이블에서 Person 테이블까지 외래 키가 필요합니다. 동시에 두 테이블에 외래 키를 가질 수 없습니다. Person 테이블에 특수 플래그를 사용하는 것이 좋습니다. 부울 유형의 '알 수 없음'필드. 그러면 사용자가 알게되었을 때이 플래그를 쉽게 전환 할 수 있습니다. –