2010-01-07 2 views
0

데이터베이스에 존재 관계를 나타내는 방법이 필요합니다. 예를 들어 인적 사항 테이블의 외래 키인 상위 ID 및 하위 ID를 저장하는 생물 역사적인 테이블 (예 : 가계도)이 있습니다. 이 표는 임의의 가족 관계를 설명하는 데 사용됩니다. 따라서 저는 X와 Y의 부모가 누구인지 정확히 알지 못해서 X와 Y가 형제임을 말하고 싶습니다. A와 B가 각각 X와 Y의 부모가되도록 두 명의 다른 사람 A와 B가 존재한다고 말할 수 있기를 바랍니다. A와 B가 누구인지를 알면 화해 할 수 있어야합니다. 그들.관계형 데이터베이스에서 존재하는 사실 모델링

내가 생각할 수있는 가장 간단한 해결책은 음수 정수 사용자 ID를 사용하여 실존 인물을 저장하는 것입니다. 사람들이 누구인지 알게되면 ID를 모두 캐스케이드해야합니다. 이것에 대한 잘 알려진 기법이 있습니까?

답변

1

실존 적 의미는 "존재하지 않음"입니까?

음수 일 필요는 없습니다. 성/이름과 플래그가 "알 수없는 사람"인 사람 테이블에 레코드를 추가하기 만하면됩니다. 또는 원한다면 실존 적입니다.

그런 다음 성이 있지만 처음이 아닌 것을 알고 있으면이 레코드를 업데이트하십시오.

중복 된 사람을 조정하는 것이 더 어려울 수 있습니다. 나는 FamilyTree set parent_id = new_id를 parent_id = old_id 등으로 갱신 할 수 있다고 생각한다. 그러나 이것은 동일한 사람이 너무 많은 부모를 갖게 될 수 있다는 것을 의미하므로, 그렇게하기 전에 여러 가지 복잡한 검사를 수행해야한다. .

+0

그건 나에게 아이디어를주지. 어쩌면 ID로만 구성된 "실존 적 사람"테이블을 가질 수 있습니다. 그런 다음 우리가 알고있는 데이터를 포함하는 다른 사람의 테이블. 이것은 개인 프로젝트이므로 너무 학문적이지도 신경 쓰이지 않습니다. –

+0

다른 테이블은 나쁜 생각입니다. FamilyTree 테이블에서 Person 테이블까지 외래 키가 필요합니다. 동시에 두 테이블에 외래 키를 가질 수 없습니다. Person 테이블에 특수 플래그를 사용하는 것이 좋습니다. 부울 유형의 '알 수 없음'필드. 그러면 사용자가 알게되었을 때이 플래그를 쉽게 전환 할 수 있습니다. –

0

흠, 생각해 보니 어쨌든 중복 된 사람을 조정하는 일반적인 방법이 필요하며이 용도로 사용할 수 있습니다. 생각?

+0

기본 질문에 대한 수정 사항으로 추가해야합니다.이 섹션은 답변만을위한 것입니다. – notJim

1

나는 것 자체로 사람의 테이블을 연결하는 링크 테이블에서만 알려진 관계를 문서화하는 경우 각 관계 유형에 대한 몇 가지 그 테이블에 적절한 제약 조건 (또는 여러 테이블로

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이 쿼리의 역을해야 할 수도 있습니다 교환 적, 다른 관계와는 달리).

관련 문제