Sql 代理键';偏好';解释

Sql 代理键';偏好';解释,sql,database-design,surrogate-key,natural-key,Sql,Database Design,Surrogate Key,Natural Key,据我所知,自然密钥的纯粹主义者和代理密钥的纯粹主义者之间正在进行一场战争。在喜欢这篇文章的人中(有更多的人)说“自然钥匙对你不好,总是使用代理 然而,无论我是愚蠢的还是盲目的,我都看不出有什么理由总是使用代理密钥 假设您有3个如下配置的表: 为什么我需要它的代理密钥??我的意思是,没有它是完全有道理的 另外,有人能解释一下为什么主键永远不应该根据代理键纯粹主义者而改变吗?我的意思是,如果我说color\u id VARCHAR(30),一个键是black,我不再需要黑色,因为我要把它改成carb

据我所知,自然密钥的纯粹主义者和代理密钥的纯粹主义者之间正在进行一场战争。在喜欢这篇文章的人中(有更多的人)说“自然钥匙对你不好,总是使用代理

然而,无论我是愚蠢的还是盲目的,我都看不出有什么理由总是使用代理密钥

假设您有3个如下配置的表:

为什么我需要它的代理密钥??我的意思是,没有它是完全有道理的

另外,有人能解释一下为什么主键永远不应该根据代理键纯粹主义者而改变吗?我的意思是,如果我说
color\u id VARCHAR(30)
,一个键是
black
,我不再需要黑色,因为我要把它改成
carbon
,为什么把
black
键改成
carbon
和所有引用列是个坏主意

编辑:只是注意到我甚至不需要改变它!只需创建一个新的,更改引用列(就像我必须使用代理键一样),然后让旧的保持安静

在代理密钥咒语中,我需要创建额外的条目,比如说,
id=232
name=black
。这对我真的有什么好处?我桌上有一把备用钥匙,我不再需要了。我还需要加入,以获得一个颜色的名称,而否则我可以留在一个表和快乐


请向一个5岁的孩子解释,请记住,我不是想说“代理密钥不好”,我是想理解为什么有人会说“始终使用代理密钥!”

嗯,我自己更喜欢自然键:)

但代理键也有它的优点,即使你像我一样想一路“自然”:

例如,我有一个表,由于各种限制,它必须被定义为依赖于其他表。差不多

Table Fee (
foreign_key1,
foreign_key2,
foreign_key3,
value)
记录由三个外键定义/标识,但同时,最多可以有两个外键为空。 因此,您不能将它们创建为主键(您只需在3列上放置一个唯一键) 为了在该表上具有主键,唯一的方法是使用代理项:)

现在。。。为什么不更改主键。。。这可以被认为是相当哲学的。。。我是这样看的,希望它有意义。。。 主键本身不仅仅是unique+notnull的组合,它更多的是关于“记录的真实本质”,它在核心定义了记录。 从这个意义上说,这不是一件你可以轻易改变的事情,不是吗

以你自己为例。你有一个缺口,但它不能定义你到底是什么。你可以改变它,但做你自己的本质不会改变。 现在,如果你保留昵称,但改变你的本质。。。还是同一个人吗?不,认为它是一个“新”的人更有意义…而对于记录来说也是一样的


这就是为什么您通常不更改主键并从头定义新记录的原因

代理键在存在次优自然键的情况下非常有用:不多也不少。 次优的自然密钥可能是GUID或varchar或其他宽/非有序密钥

然而,使用代理的决定是在概念和逻辑建模过程之后的一个实现决定,基于对所选RDBMS如何工作的了解

然而,这种“拥有代理密钥”的最佳实践现在是“始终拥有代理密钥”,并立即引入。对象关系映射器还经常向所有表添加代理键,无论是否需要,这都没有帮助


对于链接(多个)表,您不需要一个:。对于具有2个int列的表,开销是代理列数据的额外50%(假设为int并忽略行元数据)

始终记住代理键是实际表列的附加列让我们采用如下表列

patient_name
address
mobile_no
email_address
请看这里,想象我们正在处理患者记录的入院事宜,因此这里我们不能使用
mobile\u no
的主键,因为我们可以使用,但有些人可能没有mobile no来代替此代用键,将其作为主键并使用实际的
mobile\u no
patient_name
作为主键,我们可以轻松执行..如果手机没有更改,没有问题,我们仍然可以使用代理键进行搜索 如下图所示

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

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

也许更适合Hm。。。我以为stackoverflow是为程序员准备的。。。?不是吗?它是为程序员准备的,但它是为特定的、可回答的问题准备的,而且你似乎已经意识到,代理/非代理问题永远不会以这样或那样的方式得到每个人都满意的回答。嗯,这些是特定的、可回答的问题。我想知道为什么我需要连接表的代理键,为什么我不能/不应该更改主键。我对关于抽象概念的定理不感兴趣——我想得到关于这两个具体问题的一些答案,这样我就可以自己判断“极端分子”是否有任何确凿的事实支持他们,或者这只是一个“圣战”的问题。这是一种平衡,就像设计中的其他一切一样。在这种特殊情况下,您可能不需要代理密钥。这里有一些可以帮助你做出最佳决策的方法。这需要一个第四或第五个标准形式的解决方案,而不是一个代理键。这就是为什么“必须定义”一句在这个问题上没有太多选择:(谢谢,疯狂中的理性之声:)。很高兴知道还有其他人同意“总是”不是一个好的做法。就像你说的,所有的实现都应该根据实际情况进行定制。回答得好。链接表的开销更大。您必须为两个外键添加唯一约束,使约束检查开销加倍。如果忽略此项,程序错误可能会引入重复的行