如果它们有用,则约定很好

“SQL Antipatterns”,第4章,“ID必需”

主键意图

主键 – 您可以使用它来标识表中具有唯一地址的行.这意味着,不仅一些代理列可以是主键.实际上,主键应该是:

>独特.每行的标识符.如果它是复合,这意味着列的值的每个组合必须是唯一的

>最小.这意味着,它不能被减少(即,如果它是复合,在不失去唯一性的情况下不能省略列)

>单身.不能定义其他主键,每个表只能有一个主键

复合与代理

有些情况下,代理密钥有利.最常见的问题 – 如果你有人名的表. first_name last_name taxpayer_id的组合可以是唯一的吗?在大多数情况下 – 是的.但从理论上讲,可能会出现重复发生的情况.因此,当代理键在任何情况下都将提供行的唯一标识时就是这种情况.

但是,如果我们谈论表之间的多对多链接,很明显,链接表将始终包含每对一次.实际上,在使用该表之前,您甚至需要检查是否存在重复项(否则 – 它是冗余行,因为除非您的设计有特殊意图存储,否则它不会包含其他信息).因此,您的ActorID MovieID组合满足主键的所有条件,并且无需创建代理键.你可以这样做,但这没有任何意义(如果不是),因为它没有意义而不是编号行.另一方面,使用复合键,您将拥有:

>独特的设计检查.您的行将是唯一的,不允许链接表重复.这有道理:因为如果链接已经存在,就不需要创建链接

>设计中没有冗余(因此,不那么全面)的专栏.这使您的设计更容易,更易读.

作为结论 – 是的,有些情况下,代理键应该(甚至必须)应用,但在您的特定情况下,它肯定是反模式 – 使用复合键.