2011-03-30 44 views
1

我希望有人能告诉我,这将是坏的数据库设计:SQL:关系数据库设计 - 多FKS给同桌

比方说,我有两个表:

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人合同,请坚持使用多对多关系表,并在关系表中指定“正在指定哪个”关系。
  • 如果您需要对合同进行排序以查找或排序1,2或N个人,则可能更方便的是拥有指示合同类型的额外属性,而不是实施大量的联合和空检查逻辑来统计每个合同的相关人员。
+0

感谢所有的评论。这里两个人确实有区别。一个是合同持有人,另一个是“随行”,如你所示。以这种方式分配到合同的人数增加的概率不是零,而是足够小。我更担心用户将3人以上分配给同一份合约 - 目前有100%的机会出错。尽管如此,这并不排除使用M:N关系,它只需在ContractPerson表中具有适当约束的“PersonNumber”字段。 – Karl 2011-03-30 14:00:12

4

“这是一个坏主意?” - 一般来说,是的。因为当你需要3,4个人时,会发生什么?

相反,建立一个多到许多加盟合同的人,ContractPerson,含ContractId间表,PERSONID

+1

“没有其他排列组合。”可以更好地表述为“在这个时间点上没有其他排列......”我们都知道requiremens需要改变,即使现在它很棒,而这就是它的原因......什么发生在3个月内的事情发生了变化。与米奇100%协议+1 – Patrick 2011-03-30 13:18:40

2

我同意米奇的是,所有的事情都是平等的,你描述的情况下更好地与服务M:N关系。

但是,对于“多个FK到同一个表”是否非常糟糕这个一般问题:我不这么认为。例如,如果Person和SecondPerson具有根本不同的用途,则应在目的之后命名字段,而不是它们指向的表。所以,而不是PersonID,PersonID_Second,你会叫他们SalesDudeID和ManagerID。

在这种情况下,使用M:N表会更不理想,因为它不太清楚哪一个是SalesDudeID,哪个是ManagerID。此外,“如果有3或4会发生什么”这个问题可以被颠倒,而不是表明模式不可扩展,但M:N模式将允许无效数据(如果3和4,如您所说,是非法的)。

再次......我同意米奇对具体问题的看法。我只是读了这个问题,好像卡尔简化了用例的清晰性,并且想要谈论他可能会或可能不会意味的更普遍的问题。 +1给米奇。