我正在迁移一个旧数据库(oracle),并且很少有表,CountryCode
它们的主键是字符串(),我正在考虑添加 Number 列作为主键,因为它可以快速使用。这些表并不大。DeptCode
RoleCodes
Codes
joins
我想知道这些表的主键是否应该从数字“1”开始,或者它可以从 100 开始,只是为了区分黑白表 PK,尽管我不认为我会在报告中显示它们。
我正在迁移一个旧数据库(oracle),并且很少有表,CountryCode
它们的主键是字符串(),我正在考虑添加 Number 列作为主键,因为它可以快速使用。这些表并不大。DeptCode
RoleCodes
Codes
joins
我想知道这些表的主键是否应该从数字“1”开始,或者它可以从 100 开始,只是为了区分黑白表 PK,尽管我不认为我会在报告中显示它们。
您不应该这样做来区分表格。那是不切实际的。
并非所有主键都必须从 1 开始,就像订单号一样。
对于序列生成的 ID,如果很容易(取决于您的数据库等),我建议从不同的值开始。您不应该在代码中使用它来区分它们,但它可以使测试更加合理。
在此之前,我遇到过一种情况,我不小心使用了一个表的外键,就好像它是另一个表的外键一样。测试通过了,因为 ID巧合地相同。发现问题后,我们更改了初始种子,发现测试清晰很多。
您用来切换到整数主键的基本原理似乎无效:使用 INT 而不是原始代码(我假设是字符串)所看到的性能增益将可以忽略不计。PK 总是被索引的,字符串或数字的索引和即时一样好。因此,除非您真的需要 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
因此:不,它不一定以 1 开头。
更大的 ERP 系统甚至有数字范围的配置部分!
现在,从数据库的角度来看:
是的,您的表应该始终有一个主键!拥有一个将极大地提高平均情况下的性能。(但在大多数数据库系统中,如果您不提供一个,则会由您看不到且无法处理的 DBMS 设置一个。有些 DBMS 甚至创建索引,但那是另一回事)
我认为保存主键的起始编号或起始值无关紧要。
重要的是它们将在连接表的 FK 中以与 MAIN 表的 PK 中相同的值表示。
代理键可以有任何值,只要它们是唯一的。毕竟,这就是使它成为“代理”的原因-值本身没有内在意义,通常甚至不应该向用户显示。话虽如此,您可以考虑使用不同的种子,仅用于测试目的,正如Jon Skeet 建议的那样。
话虽如此,您真的需要引入一个新的(代理)密钥吗?现有的自然键实际上可能导致更少的1 JOINS,并且可能对集群有用。虽然代理键有合法用途,但不要仅仅因为它“时髦”而这样做 - 始终注意您正在做出的权衡并为您的具体需求选择合适的平衡点。
1它会自动向下“传播”外键,因此您无需将子表加入父表以获得自然键 - 自然键已经在子表中。
主键从什么 int 开始并不重要。假设代码没有定期更新,我不相信 int 会更快。它在很大程度上取决于它是 varchar 还是已知大小。
我个人总是将字段名称“Id”作为表的主键,必要时定义为 int 或 bigInt。
如果表与枚举类型匹配,那么我确保 Id 与可以是任何数字的 EnumeratedType id 匹配 - 所以不,它不需要从 1 开始。
如果它与枚举类型不匹配,那么我通常会使用从 1 开始的自动递增键,但这并不总是需要。
注意 - 如果行数很少,那么索引数字和 varchar 之间的差异将可以忽略不计。
是的,它从哪个整数开始并不重要,它的主要用途是唯一地定义行和其他表之间的关系。