MySQL中的代理键_mysql – 应该创建代理键而不是复合键吗?

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

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

主键意图

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

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

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

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

复合与代理

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

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

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

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

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

参考文献:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值