加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在什么条件下我们需要在数据库中使用复合键

发布时间:2020-12-14 05:41:31 所属栏目:Java 来源:网络整理
导读:我已经看到我们可以使用复合键,其中主键由两个表的组合主键组成. 喜欢人和书 person_id and book_id will make the primary key. 但我想问一下,我们需要硬编码编程语言 我的意思是,我可以使用任何名称的单独列作为主键 然后我不必硬编码它,我可以像往常一样
我已经看到我们可以使用复合键,其中主键由两个表的组合主键组成.

喜欢人和书

person_id and book_id will make the primary key.

但我想问一下,我们需要硬编码编程语言

我的意思是,我可以使用任何名称的单独列作为主键
然后我不必硬编码它,我可以像往常一样执行我的功能

id,person_id,book_id

解决方法

在“新”应用程序中永远不应考虑复合键.过去曾经使用它们的人曾经认为“商业钥匙”比“代理钥匙”更好.

编辑:正如克里斯所问,我正在扩大我的答案.

首先让我说明我将这个问题理解为“复合主键”与“代理键”.

此外,我承认有一个用例,其中复合键是有意义的:在交叉引用表中,也称为“链接表”.它们用于多对多表中,并且只包含两个字段,两个字段都是形成外部参照表主键的外键.例如,UserRole表将包含user_id和role_id,没有别的.例如,对于像这样的表,Java中没有类表示.这通常是@ManyToMany,双方都有一个Collection.

我在另一个答案(Hibernate : Opinions in Composite PK vs Surrogate PK)中分享了我对自然键和代理键的看法,我相信复合键有一些自然键的缺点,没有带来任何实际好处.

复合键的问题是您需要两个值来唯一标识记录.一旦开始具有引用第一个表中的记录的表,这就成了问题.然后第二个表需要两列才能引用一条记录.如果第二个表使用由单个值组成的复合键作为外键,则现在有三列可唯一标识一个记录.第三个表需要这三个额外的列才能引用第二个表中的一个记录.真的,这是一个雪球.

另一个缺点是需求会发生变化.每时每刻.因此,今天似乎是一个好的复合键并不是明天的关键.这就是为什么我们有代理键:为了面向未来.

主要使用复合键,以便表中的记录基于一组列是唯一的.例如,如果您有Customers表,则可能将NationalId Country作为唯一值,这意味着如果两个用户的国家/地区是美国,则他们无法共享相同的SSN.但如果两个记录不在同一个国家/地区,则可以使用相同的数字.如果你喜欢复合键,这将是一个很好的选择.但正如我之前所暗示的那样,您可以使用代理键并应用唯一约束.您将获得复合键的好处以及代理键的安全性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读