2011-03-30 1 views
1
나는이 나쁜 데이터베이스 설계 될 경우 누군가가 나에게 말할 수있는 기대했다

여러 FKS :SQL : 관계형 DB 설계 - 같은 테이블

의 내가 두 개의 테이블이 있다고 가정 해 봅시다 :

Person 
Contract 

을 그리고의 말을하자 나는 한 가지 계약 (한 사람 만 포함)과 공동 계약 (두 사람 포함)의 두 가지 유형의 계약을 체결합니다. 다른 순열은 없습니다.

그것은이 널 중 하나는 두 개의 FK 필드와 계약 테이블을 설정하는 가장 간단한 것 즉 :

계약 :

ContractID  Description    PersonID  PersonID_Second 
1    Single person contract 1112   NULL 
2    Joint contract   1073   900 

이 나쁜 생각인가?

감사

답변

2

두 개의 센트 : 관계은 두 사람과 계약간에 동등합니까? "첫 번째"사람과 "두 번째 함께 타고"사람이 있습니까? 아니면 둘 다이 계약과 관련하여 동등한 중요성을 공유합니까? 한 사람과 두 사람 (그리고 가능한 미래 N 인물) 계약의 차이는 계약의 중요한 속성입니까?

  • 관계가 동일한 경우 Mitch의 다 대다 솔루션을 사용하십시오.
  • 첫 번째와 두 번째 사이에 중요한 구별이있는 경우 Parched Squid의 [내 아침을 더 좋게 만들었다 고 말했습니다!] 여러 개의 FK 수정이 잘 작동합니다.
  • 그러나 N 명 계약을 수행하는 경우 관계 테이블에서 "어느"관계가 지정되는지를 나타내는 추가 속성을 사용하여 many-to-many를 고수하십시오.
  • 1, 2 또는 N 인물을 찾아서 정렬하려면 계약을 정렬해야하는 경우 많은 조인을 구현하는 대신 계약 유형을 나타내는 추가 특성을 갖는 것이 더 편리 할 수 ​​있습니다. 각 계약의 관련 인력을 계산하는 널 (null) 체킹 로직.
+0

확실히 두 사람의 구별이 있습니다. 하나는 계약 보유자이고, 다른 하나는 귀하가 지시 한대로 "타고 가십시오"입니다. 이 방법으로 계약에 배정 된 사람의 수가 계속 증가 할 확률은 0이 아니지만 충분히 작습니다. 나는 3 + 사람을 동일한 계약에 배정하는 사용자에 대해 더 걱정한다. 현재로서는 100 % 확률이 잘못되었다. 여전히 M : N 관계 사용을 배제하지 않고 적절한 제약 조건이있는 ContractPerson 테이블의 "PersonNumber"필드 만 있으면됩니다. – Karl

4

"이 나쁜 생각인가?" - 일반적으로 그렇습니다. 계약서에 3 명, 4 명이 필요할 때 어떻게 될까요?

대신,이 대다 계약 및 ContractId을 포함하는 사람, ContractPerson 사이의 테이블을 조인은 모든 조건이 동일, 당신이 설명하는 경우가 더와 함께 제공되는

+1

"다른 순열은 없습니다." "다른 순열은 없습니다 ... 지금 시점에서 ..."우리 모두는 요구하는 사람들이 바뀌 길 좋아한다는 것을 알고 있습니다. 그리고 지금 당장 위대하고 이것이 어떻게 ... 무언가가 바뀌면 3 개월 안에 일어납니다. Mitch +1과 100 % 합의 모든 의견을 주셔서 감사합니다. – Patrick

2

내가 미치 동의를 PersonId 만들 M : N 관계.

그러나 "동일한 테이블에 여러 개의 FK"가 상속 적으로 나쁜지 여부에 대한 일반적인 질문에 대해서는 그렇게 생각하지 않습니다. 예를 들어, Person과 SecondPerson이 근본적으로 다른 목적을 가지고 있다면, 필드의 목적이 아닌 필드의 이름을 지정합니다. 따라서 PersonID, PersonID_Second 대신 SalesDudeID 및 ManagerID를 호출하십시오.

이 경우 M : N 테이블을 사용하는 것이 덜 바람직합니다. 그 이유는 어느 것이 SalesDudeID이고 어느 것이 ManagerID인지 명확하지 않기 때문입니다. 또한 "3 또는 4가있을 경우 어떻게 될 것인가"라는 질문은 스키마가 확장 가능하지 않다고 제안하지 않도록 반전 될 수 있지만 M : N 스키마는 유효하지 않은 데이터를 허용합니다 (3과 4가 불법 인 경우)).

다시 ... 나는 특정 질문에 미치와 동의합니다. Karl이 명확성을 위해 유스 케이스를 단순화하고 의미가 있거나 그렇지 않을 수도있는 좀 더 일반적인 질문에 대해 말하고 싶었던 것처럼 질문을 읽었습니다. 미치에게 +1.