嗨,我有一个父表,它有ID和其他一些列,还有一个子表,它有很多基于这个ID(外键)的值。我想使用主键sequence和这个父表ID作为外键来创建表,但是后来我发现我又多了一个外键EMPID,通过组合可以提供唯一性。即使对于检索和批量更新,我也可以简单地使用这两个FK的组合。那么,我是否仍然需要使用序列生成器,同时考虑到DB的性能,或者只是删除主列。
发布于 2010-02-18 14:39:02
如果您确信永远不需要或不想引用序列生成键(且其他对象都不会引用该ID),那么删除它应该是安全的,只要您可以您的外键组合将始终提供唯一的组合。
如果您确实注意到了性能问题,您可能希望索引作为外键的列(现在,外键将作为主键),以提高查询这些列的性能。
发布于 2010-02-18 14:52:11
关系纯化论者会告诉您,根本不需要顺序生成的ID列-每个表中的主键应该是唯一标识每行的列的组合。(如果有多个执行此操作的列组合,则选择一个作为主键,并使用唯一约束强制其他列)。
当这些列中有一个或多个列很大或不方便时,或者这样的列的数量使主键本身变得很大和不方便时,这种情况往往会出现问题。这就是我与关系纯化论者不同的地方,我说继续,添加一个代理键(这是标识/序列ID列更恰当的名称)。但是要确保其他键仍然使用唯一性约束来强制执行。
所以可以肯定的是,没有理由必须在表中有一个ID列。如果每个表都必须有一个,您会认为DB产品会自动为您提供它。
发布于 2010-02-18 22:10:01
(我本想把这段话放在评论里,但是太长了。)
主键在理论上不必是不可变的;然而,在现实世界中,拥有可变的主键是一场噩梦,原因有两个:
简而言之:
如果您的键值可能会发生更改,可能会更改
--信用卡号码或帐号是一个坏的主键,因为它可以改变,而名字是一个非常糟糕的选择
或
您有任何通过外键依赖于此表的数据(当需求出现时,重构此表非常容易)
先使用,然后使用
创建一个代理键作为主键。您已经找到了表的自然键,这很棒;在这些列上也放置了一个惟一的约束。
https://stackoverflow.com/questions/2289328
复制相似问题