문제

하나는 자신과 하나에서 많은 관계를 가질 수있는 엔티티의 테이블을 어떻게 구조화할까요? 구체적으로, 나는 동물 육종을 추적하기 위해 앱을 연구하고 있습니다. 각 동물에는 ID가 있습니다. Sire ID와 Dame ID도 있습니다. 따라서 Sire 또는 Dame에서 자손에 이르기까지 많은 사람들을 가질 수 있습니다. 나는 다음과 같은 것에 경향이 있습니다.

ID INT NOT NULL PRIMARY KEY
SIRE_ID INT 
DAME_ID INT

구매하여 번식 재고에 추가 된 동물과 나머지는 테이블에 ID를 추가 한 동물에 대해 널 값을 기록하십시오.

그래서:

  1. 누군가가 이런 종류의 관계를 모델링하는 것을 논의하는 기사/웹 페이지를 알려줄 수 있습니까?
  2. ID가 int 또는 일종의 문자열이어야합니까? INT의 Null은 동물이 데이터베이스에 부모가 없지만 특수 플래그 값이있는 문자열은 동일한 것을 나타내는 데 사용될 수 있음을 나타냅니다.
  3. 이것이 두 테이블을 통해 가장 잘 모델링 될 수 있습니까? 나는 동물을위한 하나의 테이블과 친족을 나타내는 별도의 테이블을 의미합니다.

    동물

    id int null 기본 키가 아닙니다

    혈연 관계

    ID int NOT NULL 1 차 키 외국 키

    sire_id int 기본 키 외국 키

    DAME_ID int 기본 키 외국 키

위의 것에 대해 사과드립니다. 내 SQL은 녹슬 었습니다. 나는 그것이 내가 생각하는 것을 전달하기를 바랍니다.

도움이 되었습니까?

해결책

글쎄, 이것은 "정상적인"일대일 관계이며 당신이 제안한 방법은 그것을 해결하기위한 고전적인 방법입니다.

두 개의 테이블이 비정규 화되어 있습니다 (SuperKey-Is-Well-Well-well-subset-key-fsck-i forgot 부분이 어디에 있는지 정확히 지적 할 수는 없지만 확실하지만 확실합니다. 어딘가에 있습니다); 직관적 인 이유는 첫 번째 튜플이 두 번째 튜플에서 가장 튜플과 일치하기 때문에 Null Sire와 Dame ID를 가진 동물이 많지 않으면 어떤 전망에서도 좋은 솔루션이 아닙니다 (성능을 악화시켜줍니다. 필요합니다. 필요합니다. 가입 - 스토리지 요구 사항을 줄이지 않습니다).

다른 팁

하나의 테이블 만 사용하는 레이아웃은 괜찮다고 생각합니다. ID와 동일한 데이터 유형에서 sire_id 및 dame_id를 유지하고 싶습니다. 또한 외국 키로 선언하고 싶습니다 (동일한 테이블에 대한 외국 키 포인트를 가질 수 있으며 외국 키는 Null이 될 수 있습니다).

ID INT NOT NULL PRIMARY KEY
SIRE_ID INT REFERENCES TABLENAME (ID)
DAME_ID INT REFERENCES TABLENAME (ID)

이 레이아웃을 사용하면 부모 동물을 쉽게 찾아 볼 수 있으며 주어진 동물에 대한 자손 트리를 만들 수도 있습니다 (Oracle의 경우 연결되어 있음).

MySQL 웹 사이트에서 몇 달 전에 비슷한 질문을했습니다. Peter Brawley로부터 이러한 유형의 관계에 대해받은 응답을 살펴 보는 것이 좋습니다. http://forums.mysql.com/read.php?135,187196,187196#msg-187196

주제를 더 조사하려면 Wikipedia에서 트리 계층을 조사하는 것이 좋습니다.

대체 제안 된 아키텍처 (완전히 정규화)는 다음과 같은 것 같습니다.

표 : 동물

id | 이름 | 새끼를 낳다

표 : 가계도

동물 _id | parent_id | ParentType (sire 또는 dame)

INT는 ID 열에 더 나은 선택이며 시퀀스를 사용하여 고유 ID를 생성 해야하는 경우 더 적합합니다.

디자인을 두 개의 테이블로 나누는 데 어떤 이점이 없습니다.

나는 동물 사육에 대해 모른다. 그러나 당신의 sire_id는 아버지이고 dame_id는 어머니입니까? 문제 없어요. 동물 당 한 줄, Null Sire_ 및 Dame_id는 구입 한 동물에 대해서는 아무런 문제도 예상하지 않습니다.

[ID],[Sire_ID],[Dame_ID];
0,null,null  (male)
1,null,null  (female)
2,null,null  (female)
3,0,1 (male)
4,0,2 (male)
5,null,null  (female)
6,3,5
7,4,5

기타 등등. 당신은 아마도 TreeView 또는 XmlNodelist를 while 루프로 채울 것입니다 ...

While (myAnimal.HasChildren) {
 Animal[] children = GetChildren(Animal.ID)
 for (int x=0; x<children.length; x++) 
  myAnimal.Children.Add(children[x]);
}

이 경우 동물은 동물 모음입니다. 그러므로, myanimal.children [0] .father는 myanimal을 돌려 줄 것입니다. .parent []는 두 부모의 모음 일 수 있으며, [0]은 항상 한 부모 (아버지)이고 [1]은 항상 다른 부모 (어머니) 인 한 작동해야합니다.

ID를 자동 흡수 PK로 만들고 부모의 ID를 반환하여 SIRE_ID 및 DAME_ID를 프로그래밍 방식으로 할당하십시오. 실제로 원한다면 두 부모 ID 모두 ID를 다시 참조 할 수 있지만 외국의 주요 관계는 필요하지 않습니다.

"Connect By"절을 사용하여 SQL을 사용하여 따라야 할 계층 구조를 알려주십시오.

동물이 많은 부모를 가질 수 없다면 실제로는 하나에서 많은 관계가 아닙니다.

나는 동물을위한 고유 한 키 ID, 각 부모를위한 하나의 int 필드, 아마도 동물에 대한 일반적인 메모에 사용할 텍스트 필드가있는 경우, 그 경우에 구입 한 위치와 같은 텍스트 필드를 가진 단일 테이블로 남겨 둘 것입니다.

동물에게는 하나의 사이어와 하나의 댐 만 있다는 것이 분명하기 때문에 단일 테이블을 사용하는 것이 가장 의미가 있다고 생각합니다. 내가 선호하는 것은 int 또는 bigint를 행 식별자로 사용하는 것이며, 널 값은 관계가 없음을 나타냅니다. 아마도 다른 방법을 사용하여 동물을 고유하게 식별하여 테이블에 두 번 끝나지 않고 해당 열에 고유 한 색인을 만들었을 것입니다.

나무처럼 물건을 만들고 싶은 것 같습니다.

어떤가요? :

 ID          Primary Key,
 Parent_ID   Foreing_Key
 ( data )

자신과의 관계가있는 테이블에서 쿼리를 수행하는 기능이 있습니다. 구문을 참조하십시오 연결하십시오: http://www.adp-gmbh.ch/ora/sql/connect_by.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top