哪一个是最佳实践,为什么?
a) 类型表,代理/人工键
外键是从user.type
到type.id
:
b) 类型表,自然键
外键是从user.type
到type.typeName
:
哪一个是最佳实践,为什么?
外键是从user.type
到type.id
:
外键是从user.type
到type.typeName
:
第一个更具前瞻性,因为它允许您在不更新整个用户表的情况下更改表示类型的字符串。换句话说,您使用代理键,这是为了灵活性而引入的附加不可变标识符。
使用代理键(而不是名称之类的自然键)的一个很好的理由是,当自然键在唯一性方面并不是一个好的选择时。在我的一生中,我认识不少于 4 个“克里斯·史密斯”。人名不是唯一的。
我更喜欢使用代理键。人们通常会识别并使用自然密钥,这在一段时间内会很好,直到他们决定要更改值。然后问题就开始了。
您可能应该始终使用 ID 号(这样,如果您更改类型名称,则不需要更新用户表)它还允许您降低数据大小,因为一个充满 INT 的表比一个小得多充满 45 个字符的 varchars。
如果 typeName 是一个自然键,那么它可能是更可取的选项,因为它不需要连接来获取值。
仅当名称可能更改时,您才应该真正使用代理键 (id)。
请给我代用钥匙。
当您需要编写一些代码时,另一个可能更容易,但最终会更难。过去,我的技术老板决定使用电子邮件地址作为主键是个好主意。不用说,当人们想改变他们的地址时,它真的很糟糕。
无论何时使用自然键。名称通常不起作用。它们太易变了。
如果您正在发明自己的数据,那么您不妨发明一个合成密钥。如果您正在构建由其他人或其软件提供的数据数据库,请分析源数据以了解他们如何识别需要识别的事物。
如果他们很好地管理数据,他们将拥有适用于重要内容的自然键。对于不重要的东西,适合自己。
好吧,我认为当您没有任何唯一标识的键的值相关且有意义的唯一标识键作为其主键时,我认为代理键很有帮助......此外,代理键更易于实现且维护开销更少。
但另一方面,代理键有时会通过加入表格来增加成本。想想“用户”……我有
UserId varchar(20), ID int, Name varchar(200)
作为表结构。
现在考虑我想在许多表上跟踪谁在插入记录...如果我用Id
作主键,那么[1,2,3,4,5..]
etc 将在外部表中,每当我需要知道谁在插入数据时,我必须加入因为用它 User Table1,2,3,4,5,6
是没有意义的。但是如果我UserId
用作唯一标识的主键,那么其他外部表[john, annie, nadia, linda123]
等将被保存,这有时很容易区分和有意义。所以我每次查询时都不需要加入用户表。
但请注意,它需要一些额外的物理空间,因为 varchar 保存在需要额外字节的外部表中。当然,索引有一个显着的性能问题,其中 int 性能比 varchar 更好
代理键是自然主键的替代品。它只是每一行的唯一标识符或数字,可用作表的主键。代理主键的唯一要求是它对于表中的每一行都是唯一的。
它很有用,因为自然主键(即客户表中的客户编号)可以更改,这使得更新更加困难。