代理关键'偏好'解释

时间:2013-05-13 07:57:56

标签: sql database-design surrogate-key natural-key

据我所知,自然键的纯粹主义者和代理键的纯粹主义者之间正在发生战争。喜欢这个this帖子(还有更多)的人说'自然键对你不好,总是使用代理......

然而,无论是我是愚蠢还是盲目,但我总是看不到有代理钥匙的理由!

假设您在配置中有3个表,如下所示:Link table

为什么我需要一个代理键?我的意思是没有它是完全合理的。

此外,有人可以解释为什么主键不应该根据代理键纯粹主义者改变?我的意思是,如果我说color_id VARCHAR(30)而密钥是black,而我不再需要黑色,因为我将其更改为charcoal,为什么更改{{{ 1}} black的关键字以及所有引用列?

编辑:刚刚注意到我甚至不需要改变它!只需创建一个新的,更改引用列(与我将使用代理键相同)并保持旧的一个......

在代理关键口头禅中,我需要创建额外的条目,例如charcoalid=232。这对我有什么好处?我在表中有一个备用钥匙,我不再需要了。另外我需要加入才能获得颜色名称,否则我可以留在一张桌子上并且快乐吗?

请向5岁的孩子解释,请记住,我并不是说“代理关键是不好的”,我试图理解为什么会有人说“总是使用代理键!”。

3 个答案:

答案 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_nopatient_name作为主键然后我们可以轻松执行..如果移动没有改变没有问题,我们仍然可以在代理键的帮助下搜索 像下面..

在这里,您可以在实际数据的顶部编写代理键

patient_no----->primary key[surrogate key]
patient_name ---->pk
address
mobile_no--->pk
email_address