据我所知,自然键的纯粹主义者和代理键的纯粹主义者之间正在发生战争。喜欢这个this帖子(还有更多)的人说'自然键对你不好,总是使用代理......
然而,无论是我是愚蠢还是盲目,但我总是看不到有代理钥匙的理由!
假设您在配置中有3个表,如下所示:
为什么我需要一个代理键?我的意思是没有它是完全合理的。
此外,有人可以解释为什么主键不应该根据代理键纯粹主义者改变?我的意思是,如果我说color_id VARCHAR(30)
而密钥是black
,而我不再需要黑色,因为我将其更改为charcoal
,为什么更改{{{ 1}} black
的关键字以及所有引用列?
编辑:刚刚注意到我甚至不需要改变它!只需创建一个新的,更改引用列(与我将使用代理键相同)并保持旧的一个......
在代理关键口头禅中,我需要创建额外的条目,例如charcoal
和id=232
。这对我有什么好处?我在表中有一个备用钥匙,我不再需要了。另外我需要加入才能获得颜色名称,否则我可以留在一张桌子上并且快乐吗?
请向5岁的孩子解释,请记住,我并不是说“代理关键是不好的”,我试图理解为什么会有人说“总是使用代理键!”。
答案 0 :(得分:5)
如果有一个次优的自然键,代理键很有用:不多也不少。 次优的自然键可以是GUID或varchar,也可以是宽/无序的。
但是,在概念和逻辑建模过程之后,基于所选RDBMS如何工作的知识,决定使用代理是实现决策。
然而,这种“有代理钥匙”的最佳做法现在“总是有一个代理密钥”,并立即引入。对象关系映射器通常还会将代理键添加到所有表中,无论是否需要,这都无济于事。
对于链接(多个)表,您不需要一个:SQL: Do you need an auto-incremental primary key for Many-Many tables?。对于具有2个int列的表,开销是代理列的额外50%的数据(假设整数并忽略行元数据)
答案 1 :(得分:1)
嗯,我自己更关注自然键:)
但代理键可以有其优点,即使你喜欢我想要一直“自然”:)
例如,我有一张表,由于各种限制,必须将其定义为依赖其他人。像
这样的东西Table Fee (
foreign_key1,
foreign_key2,
foreign_key3,
value)
记录由三个外键定义/标识,但同时,最多可以有两个外键为空。 因此,您无法将它们创建为主键(您只需在3列上添加一个唯一键) 为了在该表上拥有主键,唯一的方法是使用代理:)
现在......为什么不改变主键......这可以被认为是非常哲学的...我以这种方式看待它,希望它有意义...... 主键本身不仅是唯一+非空的组合,更多的是“记录的真正本质”,它定义了核心记录。 从这个意义上说,这不是你可以轻易改变的东西,对吗?
以自己为榜样。你有一个缺口,但它没有定义你真正的东西。你可以改变它,但作为自己的本质不会改变。 现在,如果你保持昵称,但改变你的本质......它仍然是同一个人吗?不,将它视为一个“新”人更有意义......对于记录来说,它是一样的......
因此,您通常不会更改主键并从头开始定义新记录
答案 2 :(得分:0)
始终记住代理键是我们实际表格列的附加列,让我们采用如下表格列
patient_name
address
mobile_no
email_address
看到这里想象我们正在处理患者记录的录取,所以在这里我们不能mobile_no
使用主键,因为我们可以接受,但是有些人可能没有移动号而不是代替这个代理键并将其作为主键,并将实际的mobile_no
,patient_name
作为主键然后我们可以轻松执行..如果移动没有改变没有问题,我们仍然可以在代理键的帮助下搜索
像下面..
在这里,您可以在实际数据的顶部编写代理键
patient_no----->primary key[surrogate key]
patient_name ---->pk
address
mobile_no--->pk
email_address