使用设计者定义的ID与自动生成的ID

时间:2012-03-20 16:55:32

标签: database database-design

这更多是实际数据库设计的问题。我之前设计过较小的数据库,但我现在正在做的事情(几百万条记录)没什么,我现在需要比以前更多地考虑效率和性能。

考虑以下内容:给一个ID为10的左右大表。这当然是主要的关键。根据我的理解,将密钥存储为整数是不好的做法,除非您打算对其进行数学运算(如果我在这里错了,请纠正我)。是否最好将密钥存储为nvarchar(n),其中n是密钥的字符串长度?如何制作自己的主键(比如增量键)?密钥的大小会更小,但它是否足以减少您可以直接将数据导入已定义关系的数据库这一事实? (从另一个表导入带有外键的表。就像状态代码一样。)

1 个答案:

答案 0 :(得分:2)

将密钥存储为整数是一个好习惯,除非您需要前导零。您希望密钥是可以使连接更快的最小尺寸。

大多数数据库都有自动设置增量密钥的方法,如果你需要,这往往是最好的方法,除非你不能承受由于回滚而在sequnece中缺少任何数字。实际上只有少数类型的东西可能具有leagl或者规则要求,你不能跳过序列中的项目,因此如果你想使用代理键,自动生成的id是最好的选择之一。除非你需要,否则不要制作自己的增量密钥,因为你不会像数据库那样有效地执行自动密钥,如果你弄错了,你可能会遇到竞争条件而子表最终会被分配给错误父母ID。

如果您有一个保证的唯一值(即不变),您可以使用自然键而不是代理。它可能会减慢连接速度,但也可能意味着您不必进行多次连接。但是,如果您使用自然键,请确保它实际上是唯一的,并且它很少会改变。人名,公司名称,电子邮件地址等等都不是一个好的候选人,汽车VIN号是。请记住,您不希望更改一千万条儿童记录,因为公司名称已更改。