CountryCode
,DeptCode
和RoleCodes
,它们的主键是字符串(Codes
)。我正在考虑添加一个数字列作为主键,因为这样可以更快地使用joins
。这些表的大小并不是很大。我想知道这些表的主键是否应该从数字“1”开始,或者它们可以从100开始,只是为了区分不同的表的主键,尽管我不认为我会在报告中显示它们。
CountryCode
,DeptCode
和RoleCodes
,它们的主键是字符串(Codes
)。我正在考虑添加一个数字列作为主键,因为这样可以更快地使用joins
。这些表的大小并不是很大。你不应该这样做来区分表格,因为这并不实用。
并非所有主键都必须以1开始,例如订单号。
你使用的理由切换到整数主键似乎不太合理:相比于原来的代码(我假设是字符串),使用INT而获得的性能提升将会微不足道。主键总是被索引的,对于字符串或数字的索引同样快速。因此,除非你真的需要一个INT,否则我倾向于保持原始数据类型并使用原始数据 - 这简化了数据迁移(这是在进行任何工作时都应该考虑的事情)。
在ERP系统中,定义代表某个物品组的数字范围非常普遍。
这可以作为更大数字中的位置,例如:
1234567890
| |
index 4 - 6 represents region code
index 7 - 8 represents dept code...
或者,就像我怀疑你的情况一样,在同一个位置的不同部分,比如
1000 - 1999 Region codes
2000 - 2999 DeptCode
3000 - 3999 RoleCode
我认为起始数字或起始值并不重要,它们将持有主键。重要的是,在联接表的外键中,它们将用与主表主键相同的值表示。
代理键可以具有任何值,只要它们是唯一的。这就是为什么它被称为“代理”的原因 - 值本身没有固有的含义,通常甚至不应该向用户显示。话虽如此,您可以考虑使用不同的种子进行测试,就像Jon Skeet建议的那样。
话虽如此,您真的需要引入新的(代理)键吗?现有的自然键实际上可能会导致1更少的连接,并且可能对聚集有用。虽然代理键有合法用途,但不要仅仅因为它“时髦”而这样做 - 要始终注意您所做出的权衡,并选择适合您具体需求的正确平衡。
1它会自动“传播”到外键,因此您不需要将子表连接到父表以获取自然键 - 自然键已经在子表中。
主键从哪个整数开始并不重要。 假设代码不经常更新,我认为整数不会更快。它更依赖于它是一个varchar还是已知大小。
我个人总是将一个名为“Id”的字段作为表的主键,定义为int或bigInt(如果需要)。
如果表与枚举类型匹配,则我会确保Id与枚举类型id匹配,该id可以是任何数字-因此不需要从1开始。
如果它不匹配枚举类型,则通常会使用自动递增键从1开始,但这并不总是必要的。
请注意-如果行数很少,则在数字和varchar上进行索引的差异将是微不足道的。
是的,它起始于哪个整数并不重要,它的主要作用是唯一地定义行并在其他表之间建立关系。