如何选择(自然)主键

时间:2017-01-18 19:56:36

标签: sql-server database database-design

假设在一个名为Partners的表中有一个关于供应商和客户的信息表(因为一个合作伙伴可以在一个时间点是供应商,而另一个合作伙伴可以是其他合作伙伴)。 合作伙伴表有通常的东西:公司名称,简称,地址,城市,国家。现在,对于国内合作伙伴,有DomesticVatNumber,而对于非国内合作伙伴则有InternationalVatNumber。通常,增值税号码将是主键的完美候选者,但问题在于并非所有国内合作伙伴都拥有InternationalVatNumber且国际合作伙伴没有DomesticVatNumber。

我正在尝试在db中查看设计此方法的最佳方法。在这种情况下,代理关键是唯一的选择,还是我应该重新考虑在同一张桌子上有国内和国际合作伙伴?我是否可以将它们分成两个表:DomesticPartners(总是有DomesticVatNumber)和InternationalPartners(总是有InternationalVatNumber),然后分别把主键放在DomesticVat和InternationalVat列上?

每种方法的优点/缺点是什么?

2 个答案:

答案 0 :(得分:1)

就个人而言,我永远不会从外部方分配的东西中制作主键,也不会使用用户所见过的值。我总是使用无意义的密钥(标识列或唯一标识符)。

鉴于你的意思,我不会将它们拆分成单独的表,因为你必须要么在外键中引用你的伙伴表的任何表必须设置两个可为空的列来执行此操作或者有一列但没有外键关系(颤抖......)。

最好的选择是拥有一个表,将国内和国际增值税号作为表中的单独字段,但不是主键。由于它们都可以为空,因此对它们的唯一约束的选择有限。

只需2美分

答案 1 :(得分:1)

随着业务的增长,您的系统变得越来越复杂,拥有一个表更有意义。一个示例可以是ENTITIES表,它存储所有人和所有内容,包括供应商和客户。这可能包括个人,团体和企业,客户和员工等。稍后您会很高兴您这样做,因为它减少了您将使用多个表的复杂连接数。您可以使用ENTITY_NO作为代理键,使用ENTITY_TYPE来区分实体。增值税号字段可以单独编制索引并可以为空。

相关问题