我有一个使用2个外键字段和一个日期字段的表。
表格使用3个或更多字段作为主键是否很常见?这样做有什么缺点吗?
-
我的3个表是雇员,培训和emp_training。员工表保存员工数据。培训桌举行不同的培训课程。我将emp_training表设计为字段EmployeeID(FK),TrainingID(FK),OnDate。
员工可以执行多个培训课程,并且可以多次执行同一培训课程。但是他们不能在同一天多次参加同一培训课程。
哪个更好地实现:
选项A-将所有3个字段设为主键
选项B-添加一个自动编号PK字段,并使用查询查找任何可能的重复项。
在使用2个字段作为主键之前,我已经创建了很多表,但是从来没有使用3个,因此我很好奇继续执行选项A是否有任何不利之处
最佳答案
值得一提的是,在SQL Server中,默认情况下PK是唯一的集群密钥,但是您也可以创建非集群PK。
您可以定义一个新的聚集索引,而不是PK。 “主键”实际上只是一个名称...
最重要的问题是:哪些列参与了集群键,并且(这是最重要的问题):它们是否具有隐式排序?并且(也非常重要):是否有许多更新操作会更改参与列的内容?
您必须知道,集群键定义了硬盘上的物理顺序。换句话说:集群键是表本身。您可以想到包含所有列的索引。如果您的前导列(最坏的情况)是GUID,则表中的每个插入都将不按顺序进行。这导致99.99%的碎片。
如果聚集索引绑定到插入时间或运行编号(最佳情况),它将永远不会碎片化!
更糟糕的是:如果存在集群键(无论是否称为PK),它将用作其他索引的查找键。
因此:在许多情况下,最好使用一个运行数字作为聚簇键和一个非聚簇的多列索引,该索引的重建要比聚簇的索引快得多。
所有索引都将从中获利!
我给你的建议:
选项C:以PK开头的运行编号,并另外具有唯一的多列密钥以确保数据完整性。无需在这里使用自己的逻辑...