我正在迁移一个旧数据库(oracle),而CountryCode
,DeptCode
和RoleCodes
等几个表的主键是字符串(Codes
)和i我正在考虑将Number列添加为主键,因为它可以与joins
一起快速运行。这些表格不是很大。
我想知道这些表的主键是否应该从数字'1开始,或者它可以从100开始只是为了区分黑白表PK虽然我不认为我会在报告中显示它们。
答案 0 :(得分:3)
你不应该这样做来区分表格。那是不切实际的。
并非所有主键都必须从1开始,如订单号的情况。
答案 1 :(得分:3)
对于序列生成的ID,我 建议从不同的值开始,如果它很容易做(取决于您的数据库等)。您不应该使用它来区分它们 in code ,但它可以使测试更合理。
在此之前,我遇到过一种情况,我不小心使用了外键一个表,好像它是另一个表的外键。由于ID 巧合,因此传递的测试相同。在我们发现问题之后,我们更改了初始种子并发现测试是 lot 更清晰。
答案 2 :(得分:2)
您用于切换到整数主键的基本原理似乎无效:您使用INT而不是原始代码(我假设是字符串)看到的性能增益将是可忽略的。 PK总是被索引,字符串或数字的索引就像瞬间一样好。因此,除非你真的需要一个INT,否则我很想坚持使用原始数据类型并使用原始数据 - 简化了数据迁移(这是在做任何工作时应该考虑的事情)。
答案 3 :(得分:1)
例如,在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甚至 创建指数,但那是另一个故事)
答案 4 :(得分:1)
我认为保持主键的起始编号或起始值无关紧要 重要的是它们将在连接表的FK中表示,其值与MAIN表的PK相同。
答案 5 :(得分:1)
代理键可以包含任何值,只要它们是唯一的。毕竟这就是它的“代理” - 价值本身没有内在意义,通常不应该向用户展示。话虽如此,您可以考虑使用不同的种子,仅用于测试目的,如Jon Skeet suggested。
话虽如此,你真的需要引入新的(代理)密钥吗?现有的自然键实际上可以导致 less 1 JOINS,并且可能对clustering有用。虽然代理键有legitimate uses,但不要仅仅因为它是“时尚” - 总是要意识到你正在做出的权衡,并为你的具体需求选择适当的平衡。
1 它会自动“传播”到外键,所以你不需要将子表连接到父表只是为了得到自然键 - 自然键已经在孩子。
答案 6 :(得分:0)
主键从哪个int开始无关紧要。 假设代码没有定期更新,我不相信int会更快。它更多地取决于它是varchar还是已知大小。
答案 7 :(得分:0)
我个人总是将字段名称“Id”作为表的主键,如果需要,可以定义为int或bigInt。
如果表匹配枚举类型,那么我确保Id匹配EnumeratedType id,它可以是任何数字 - 所以不需要从1开始。
如果它与枚举类型不匹配,那么我通常会使用从1开始的自动递增键,但这并不总是需要。
注意 - 如果行数很小,那么索引数字和varchar之间的差异可以忽略不计。
答案 8 :(得分:0)
是的,它从哪个整数开始并不重要,它主要用于唯一定义的行和其他表之间的关系。