2010-03-02 1 views
3

나는 가족의 관계를 모델링하기로되어있는 프로그램을위한 데이터베이스를 만들고있다. 는 예 : X가 Y에 아버지, Y 그래서SQL 데이터베이스 디자인

, 내가 각 구성원에 대한 모든 정보와 회원 테이블 그래서 내가 회원들 사이에 많은 관계로 많은 만드는 방법에 대한 생각이 X에 아들 테이블 자체이므로 Member_Member 브리지 테이블 복합 키로 열 "FK_FromID, FK_ToID" (이 맞습니까?)과 "FK_RelationType" 같은 외부 키 에 RelationTypes 테이블을 구비되도록하는 것이다 관계가있다. "아버지, 어머니, 아들, 딸"그리고이 두 개의 외래 키에 대한 회원 테이블에서 일대일로 진행되는 두 가지 관계

내 문제는입니다. 내가 계단식으로 선택하면 삭제할 때주기를 만들 것입니다. 왜냐하면 내가 멤버를 지우면 관련 레코드에 대한 패스가 두 개가 삭제 될 것이기 때문이다. Member_Member 브릿지는 프로그램에서 아빠 관계를 삽입 할 때마다 Member_Member 테이블에 아들 관계를 삽입 할 것이고, 거기에는 방법이있다. 또는 연쇄 적 처리를 가능하게하는 회피 방법을 사용하면 회원을 삭제할 때 외래 키 열에서 또는에 기록 된 것과 관계없이 Member_member에있는 관련 레코드를 삭제합니다.

그래서, 무엇을 해야할지 모르겠지만, 이것이 처음부터 올바른 디자인입니까? , 사이클링에 관해서해야 할 일, 또한 같은 문제에 대한 더 나은 디자인이 두 당사자간에 어떤 종류의 관계를 지정해야 하는지를 알고 있어야한다고 생각합니까?

어떤 도움을 주셔서 감사 드리며 미안합니다. 나쁜 영어 Bishoy

답변

2

SQL은 "네트워크"문제를 이렇게 잘 처리하지 못합니다.

member-member 브릿지 테이블은 끔찍한 이름입니다. 그것은 "회원 - 부모"(또는 "부모 - 자식") 교량입니다. 브리지 테이블에는 "복합 키"가 없어야합니다. 브리지 테이블에는 대리 키 (순차 번호)와 다른 테이블에 대한 FK 참조 쌍이 있습니다. 두 FK의 이름은 "회원"및 "부모"와 같아야 관계가이 테이블에 무엇인지 명확하게 알 수 있습니다.

누구나 부모가 있습니다. 모두에게 어린이가있는 것은 아닙니다. 일부 학부모는이 데이터베이스에 학부모가 없을 것입니다. 그들은 "상위 부모"입니다.

상위 부모가 상위 FK가 NULL 인 상위 - 하위 브릿지에 행이있는 것이 가장 쉽습니다. 그렇게하면 매우 복잡한 외부 조인을 피할 수 있습니다. 모든 멤버에는 적어도 하나의 멤버 - 부모 행이 있습니다. 이상적으로 두.

관계가 전이하기 때문에 많은 "cycling"문제가 있습니다.

단일 표준 SQL 쿼리에서 가족의 모든 구성원을 찾거나 가족의 최상위로 돌아가는 모든 부모 또는 모든 자식과 그랜드 자식을 찾을 수는 없습니다. 이 기능을 가능하게하는 SQL 확장이 있지만 표준은이를 제대로 처리하지 못합니다.

패밀리의 관계가 두 가지 방법 (부모에서 자식, 부모에서 자식으로)으로 전달되기 때문에 계단식 삭제가 제대로 작동하지 않지만 SQL에는 방향 (FK 참조)이 하나만 있기 때문에 잘 작동하지 않습니다.

당신은 모든 구성원이 하나 이상 (대부분 두에서) "멤버 부모"의 행과 회원의 삭제 "멤버 부모"의 두 행을 삭제 과이 있어야 보장하기 위해 시도 할 수 있습니다 키에 적절한 이름이 있으면이 작업의 일부분을 만들 수 있습니다.

회원을 삭제하면 부모 관계가 깨집니다. 구성원 - 상위 행을 삭제합니다. 좋습니다. 그들의 아이들은 어떨까요? 이 삭제 된 상위를 참조하는 member-parent가있는 다른 행은 이제 손상됩니다. 이것은 무엇을 의미 하는가? 무엇을해야합니까?

대답이 없습니다. 연결된 그래프에서 행을 제거하면 요소 이 연결되지 않습니다. 당신은 그것에 대한 합리적인 규칙을 찾아야합니다.

SQL이이 작업을 제대로 수행하지 못하므로 모든 디자인에 문제가있는 것 같습니다. 하나의 어머니와 한 아버지가 할 수있는 각 구성원을 가정

+0

+1 대부분의 내용에 동의합니다. * 브리지 테이블에 "합성 키"가 없어야합니다. * 대리 테이블에 자체 특성이 있거나 외부 키에서 참조되는 경우에만 대리 키가 필요합니다. 그리고 복합 키는 고유 한 키로 시행되어야합니다. – APC

+0

@APC : ORM을 사용하려고한다면 대용 키가 필요합니다. 이 단계를 수행하면 복합 키는 불필요한 복잡성입니다. 성능을위한 색인을 작성하고 색인을 작성하십시오. –

+1

대리 키는 관계형 무결성을 적용하지 않습니다. 유용한 장치이지만 단일 열 또는 다중 열에 상관없이 * 비즈니스 키 *를 적용해야합니다. 이제 많은 사람들이 데이터 무결성을 적용하는 응용 프로그램에 익숙하지만 나는 그 중 하나가 아닙니다. 질문자는 ORM이 아닌 데이터베이스 디자인에 대해 묻는 것 외에 내 관찰이 유효하다고 생각합니다. – APC

0
  1. , 당신은 단순히 members 테이블에 mother_idfather_id 필드를 유지하여 모든 관계를 도출 할 수있을 것입니다.

    그러나 데이터베이스 에 누락 된 정보가없는 경우에만 작동합니다. 예를 들어 X 멤버가 Y 멤버의 동생 인 경우 X 및 Y 부모가 데이터베이스에 저장되어 있지 않으면이를 알 수 없습니다.

    데이터베이스에 누락 된 정보가없는 경우 위의 데이터 무결성을 쉽게 관리 할 수 ​​있습니다. 그러나 쿼리는 조금 복잡해 질 수 있습니다.

  2. 당신이 제안한 member_member 브릿지는 관계의 방향을 의미하기 때문에 심각한 문제가 있습니다. X가 Y의 아버지라면 Y는 X의 아들이기도합니다. 둘 다에서 관계를 두 번 정의하도록 제안했습니다 일반적으로 이것은 권장되지 않습니다. 이것은 데이터 복제의 한 형태이며, 데이터 중복으로 참조 무결성을 유지하기 위해 고심 할 수 있습니다. Y가 X에

나는 이것이 완전한 답변 아니라는 것을 알고의 아들이지만, 몇 가지 관찰로 DBMS는 X가 Y의 아버지임을 알지 못하는 것을 기억하는 것은 동일합니다. 나는 S.Lott's answer에 완전히 동의한다. 관계형 데이터베이스에서이를 "해결"하는 표준 방법이 없다.

+0

답장을 보내 주셔서 감사합니다. 정말로 감사드립니다. – Bashawy