首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代理键'preference‘解释

代理键'preference‘解释
EN

Stack Overflow用户
提问于 2013-05-13 15:57:56
回答 3查看 1K关注 0票数 3

据我所知,自然键的纯粹主义者和代理键的纯粹主义者之间正在进行一场战争。在这个点赞的this帖子(还有更多)中,人们说‘自然密钥对你不好,总是使用代理...

然而,无论我是愚蠢的还是盲目的,但我看不出有一个理由总是有代理键!

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

为什么我需要一个代理密钥??我的意思是,没有它是非常有意义的。

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

编辑:我只是注意到我甚至不需要改变它!只需创建一个新的,更改引用列(就像我必须对代理键所做的那样),并保留旧的……

在surrogate key mantra中,我需要创建额外的条目,比如id=232name=black。这对我有什么好处呢?我桌子上有一把备用钥匙,我不再需要它了。另外,我需要加入才能获得一个颜色名称,否则我可以留在一张桌子上快乐?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-13 16:14:38

在存在不太理想的自然键的情况下,代理键很有用:不多,也不少。次优的自然键将是GUID或varchar,或者宽/无序。

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

然而,这个“有一个代理键”的最佳实践现在是“总是有一个代理键”,并立即引入。对象关系映射器还经常向所有表添加代理键,无论是否需要,这都无济于事。

对于链接(多对多)表,您不需要一个:SQL: Do you need an auto-incremental primary key for Many-Many tables?。对于包含2个int列的表,额外的开销是surrogate列的数据的50% (假设为int并忽略行元数据)

票数 7
EN

Stack Overflow用户

发布于 2013-05-13 16:11:28

好吧,我自己更多的是在自然键上:)

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

例如,我有一个表,由于各种约束,必须将其定义为依赖于其他表。就像这样

代码语言:javascript
复制
Table Fee (
foreign_key1,
foreign_key2,
foreign_key3,
value)

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

现在..。为什么不更改主键...这可以被认为是非常有哲理的..。我是这样看待它的,希望它会有意义。主键本身不仅仅是unique+not null的组合,它更多的是关于“记录的真正本质”,它定义了记录的核心。从这个意义上说,这不是你可以轻易改变的东西,不是吗?

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

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

票数 1
EN

Stack Overflow用户

发布于 2018-06-06 02:10:24

请始终记住,代理键是实际表列的附加列,让我们以如下所示的表列

代码语言:javascript
复制
patient_name
address
mobile_no
email_address

在这里,想象一下,我们正在处理患者记录的接收,所以这里我们不能使用mobile_no有主键,因为我们可以使用,但有些人可能没有手机no而不是这个go作为主键,并使其成为实际的mobile_nopatient_name作为主键,那么我们可以很容易地执行..here,如果移动设备没有更改,没有问题,我们仍然可以在代理键的帮助下进行搜索,如下所示。

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

代码语言:javascript
复制
patient_no----->primary key[surrogate key]
patient_name ---->pk
address
mobile_no--->pk
email_address
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16517262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档