喜欢人和书
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.但如果两个记录不在同一个国家/地区,则可以使用相同的数字.如果你喜欢复合键,这将是一个很好的选择.但正如我之前所暗示的那样,您可以使用代理键并应用唯一约束.您将获得复合键的好处以及代理键的安全性.