表中主键的最佳做法是什么?
在设计表格时,我养成了一种习惯,即让一列是唯一的,而且我是主键。 这取决于要求以三种方式实现:
数字3将用于相当小的查找,主要是读取表格,可能具有唯一的静态长度字符串代码或数字值,如年份或其他数字。
大多数情况下,所有其他表都将具有自动递增整数或唯一标识符主键。
问题:-)
我最近开始使用没有一致行标识符的数据库,并且主键当前正在跨各个列进行群集。 一些例子:
这有没有一个有效的案例? 我会一直为这些情况定义一个身份或唯一标识符列。
另外还有很多没有主键的表格。 有什么有效的理由,如果有的话?
我试图理解为什么桌子是按照原样设计的,这对我来说似乎是一个很大的混乱,但也许有充分的理由。
第三个问题有助于我解释答案:在多列用于组成复合主键的情况下,这种方法与代理/人工密钥相比有没有特定的优势? 我主要在考虑性能,维护,管理等方面?
我遵循一些规则:
关于代理与自然关键,我参考上述规则。 如果自然键很小并且永远不会改变,它可以用作主键。 如果自然键很大或可能改变,我使用代理键。 如果没有主键,我仍然使用代理键,因为经验表明,您将始终向表中添加表并希望将主键置于原位。
自然经文人造密钥是数据库社区中的一种宗教争论 - 请参阅本文及其链接的其他内容。 我既不赞成总是拥有人造钥匙,也永远不拥有它们。 我会根据具体情况决定,例如:
无论使用哪个仿真键,您都应该始终在自然键上声明唯一的约束。 例如,如果你必须使用state_id,但是你最好在state_code上声明一个唯一的约束,否则你最终肯定会得到:
state_id state_code state_name
137 TX Texas
... ... ...
249 TX Texas
只是对经常被忽视的东西进行额外的评论。 有时不使用代理键在子表中有好处。 假设我们有一个允许您在一个数据库中运行多个公司的设计(也许它是一个托管解决方案,或其他)。
假设我们有这些表格和列:
Company:
CompanyId (primary key)
CostCenter:
CompanyId (primary key, foreign key to Company)
CostCentre (primary key)
CostElement
CompanyId (primary key, foreign key to Company)
CostElement (primary key)
Invoice:
InvoiceId (primary key)
CompanyId (primary key, in foreign key to CostCentre, in foreign key to CostElement)
CostCentre (in foreign key to CostCentre)
CostElement (in foreign key to CostElement)
如果最后一位没有意义, Invoice.CompanyId是两个外键的一部分,一个是CostCentre表,另一个是CostElement表。 主键是(InvoiceId,CompanyId)。
在这个模型中,不可能将一个公司的CostElement和另一个公司的CostCentre引用并引用。 如果在CostElement和CostCentre表上使用代理键,则会是。
糟糕的机会越少越好。
链接地址: http://www.djcxy.com/p/59309.html