代理关键'偏好'解释

Ran*_*ash 1 sql database-design surrogate-key natural-key

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

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

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

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

此外,有人可以解释为什么主键不应该根据代理键纯粹主义者改变?我的意思是,如果我说color_id VARCHAR(30)了一把钥匙black,并且我不再需要黑色,因为我正在改变它charcoal,为什么改变blackcharcoal和所有引用列也是一个坏主意?

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

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

请向5岁的人解释一下,请记住,我并不是说"代理关键是不好的",我试图理解为什么会有人说'总是使用代理键!'.

gbn*_*gbn 5

在存在次优自然键的情况下,代理键非常有用:不多也不少.次优的自然键可以是GUID或varchar,也可以是宽/非有序的.

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

然而,这种"有代理钥匙"的最佳做法现在"始终有一个代理键",并立即引入.对象关系映射器还经常向所有表添加代理键,无论是否需要,这都没有用.

对于链接(多个)表,您不需要一个:SQL:您是否需要许多表的自动增量主键?.对于具有2个int列的表,开销是代理列的额外50%的数据(假设整数并忽略行元数据)