2012-07-19 64 views
3

我正在迁移旧数据库(oracle),并且有几个表,如CountryCode,DeptCodeRoleCodes,它们的主键是字符串(Codes),我正在考虑将Number列添加为主键,因为它可以快速使用joins 。这些表格并不是很大。主键总是从1开始?

我想知道如果这些表的主键应该从数字'1'开始,或者它可以从100开始只是为了区分黑白表PK,但我不认为我会在报告中显示它们。

+0

您通常可以在表设计器(MSSQL服务器)中设置初始种子 - 这是完全可以做到的。 – 2012-07-19 11:04:32

+2

主键的值是什么并不重要。只要一个*单*表不包含重复的键。两个表的两个主键之间的关系不应该打扰你。您应该只考虑一个表的主键和另一个表的外键(这些必须匹配)。 – oleksii 2012-07-19 11:08:10

回答

3

对于序列生成的ID,我建议从不同的值开始,如果它很容易做(取决于您的数据库等)。你不应该用这个来区分代码,但它可以使测试更合理。

在此之前,我有一种情况,我不小心使用了外键一个表好像它是另一个表的外键。测试通过的身份证号码为,巧合的是相同。当我们发现问题后,我们改变了最初的种子,发现测试更清晰了

0

主键从哪里开始无关紧要。 假设代码没有定期更新,我不相信int会更快。它更依赖于它是一个varchar还是一个已知的大小。

3

您不应该这样做来区分表格。这是不实际的。

并非所有主键都必须从1开始,如订单号的情况。

+0

如果PK从不同的范围开始,那么它有助于测试报告。 – user1263981 2012-07-19 11:17:15

0

我个人总是有一个字段名称“Id”作为表的主键,如果需要定义为int或bigInt。

如果表达枚举类型匹配,那么我保证ID的EnumeratedType ID可以是任何数量的匹配 - 所以没有它不需要如果没有从1

启动匹配一个枚举类型,那么我通常会使用从1开始的自动递增键,但这并不总是需要的。

注意 - 如果行数很少,那么数字和varchar上的索引之间的差异可以忽略不计。

+0

但是代码正在使用的表格非常大,所以您认为JOINS在主键上运行得更快(Varchar2数据类型) – user1263981 2012-07-19 11:12:37

+0

我不知道“big”是什么意思,但是是 - 使用整数代替连接的varchar会更快 - 表格越大,性能差异越大。就我个人而言,我尽量不要加入ID。 – BonyT 2012-07-19 12:48:09

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甚至 创建指数,但那是另一回事)

0

是,它起始于哪个整数并不重要,它主要用于定义唯一的行和其他表之间的关系。

1

我认为没有关系的起始数字或起始值将保存主键。
重要的是,它们将在连接表的FK中以与MAIN表中的PK相同的值表示。

2

你用来切换到整数主键的基本原理似乎并不合理:使用INT而不是原始代码(我假设它是字符串)将会看到的性能增益可以忽略不计。 PK总是编入索引,并且字符串或数字的索引与瞬时一样好。所以除非你真的需要INT,否则我会试图坚持原始数据类型并使用原始数据 - 简化数据迁移(这是在做任何工作时应该考虑的事情)。

+0

谢谢,这就是我只是想着。另外,这是否可以将EmpCode(Varchar2)作为PK?该表中大约有600行参考时间表和员工历史表。 – user1263981 2012-07-19 11:35:45

+0

我不明白为什么不。提出参考数据表时,索引的选择比编码字段是字符串还是数字更重要。如果整数更快,那只是因为它们是固定的4字节值,而字符串的长度可能是随机的(直到字符串字段的最大大小)。所以如果你的编码字段是(比如说)VARCHAR2(10),那么就没有问题了。我担心,如果字符串大小显着更长,但它不是一个真正的代码(“代码”意味着一个短的字符串)。 – 2012-07-19 12:06:43

+0

但是,隐藏主键(如int或guid)的好处是,您可以稍后更改代码列的值,而不会破坏外键指向该代码的所有现有数据。 – 2012-07-19 12:23:55

1

代理键可以具有任何值,只要它们是唯一的。这就是最终让它“替代”的原因 - 价值观本身并没有内在的意义,通常也不应该向用户展示。这就是说,你可以考虑使用不同的种子,仅用于测试目的,如Jon Skeet suggested

这就是说,你真的需要引入一个新的(代理)密钥?现有的自然钥匙实际上可能会导致减少 JOINS,并且可能对clustering有用。虽然代理键有legitimate uses,但不要仅仅因为它是“时髦的”就这样做 - 总是要意识到您正在做出的折衷,并为您的具体需求选择适当的平衡点。


它会自动“传播”下降外键,这样你就不需要子表JOIN父只是为了让自然键 - 自然键已经在孩子。

+0

+1,但是代孕代孕的是什么取代了一个自然的关键。 (*代孕*代表“代替”或“代替”某事。) – 2012-07-19 14:20:18

+0

@Catcall我真的不能说英语,因为它不是我的母语。但在数据库中,代理不仅仅是替代品,它代替了不同的_quality_。交替键可以很容易地取代主键,但我们不(必然)称之为“代理”。如果它的值有一定的质量(缺乏意义),我们只称它为代理。 – 2012-07-20 00:06:21