首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >即使我不能将主键用于数据库操作,也必须使用序列生成的主键吗

即使我不能将主键用于数据库操作,也必须使用序列生成的主键吗
EN

Stack Overflow用户
提问于 2010-02-18 22:36:08
回答 5查看 1.3K关注 0票数 1

嗨,我有一个父表,它有ID和其他一些列,还有一个子表,它有很多基于这个ID(外键)的值。我想使用主键sequence和这个父表ID作为外键来创建表,但是后来我发现我又多了一个外键EMPID,通过组合可以提供唯一性。即使对于检索和批量更新,我也可以简单地使用这两个FK的组合。那么,我是否仍然需要使用序列生成器,同时考虑到DB的性能,或者只是删除主列。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-18 22:39:02

如果您确信永远不需要或不想引用序列生成键(且其他对象都不会引用该ID),那么删除它应该是安全的,只要您可以您的外键组合将始终提供唯一的组合。

如果您确实注意到了性能问题,您可能希望索引作为外键的列(现在,外键将作为主键),以提高查询这些列的性能。

票数 2
EN

Stack Overflow用户

发布于 2010-02-18 22:52:11

关系纯化论者会告诉您,根本不需要顺序生成的ID列-每个表中的主键应该是唯一标识每行的列的组合。(如果有多个执行此操作的列组合,则选择一个作为主键,并使用唯一约束强制其他列)。

当这些列中有一个或多个列很大或不方便时,或者这样的列的数量使主键本身变得很大和不方便时,这种情况往往会出现问题。这就是我与关系纯化论者不同的地方,我说继续,添加一个代理键(这是标识/序列ID列更恰当的名称)。但是要确保其他键仍然使用唯一性约束来强制执行。

所以可以肯定的是,没有理由必须在表中有一个ID列。如果每个表都必须有一个,您会认为DB产品会自动为您提供它。

票数 1
EN

Stack Overflow用户

发布于 2010-02-19 06:10:01

(我本想把这段话放在评论里,但是太长了。)

主键在理论上不必是不可变的;然而,在现实世界中,拥有可变的主键是一场噩梦,原因有两个:

  1. 随着关系模型的增长,每个子表必须包含父表的主键的每一列。与所有唯一约束一样,
  2. 主键也是由索引强制执行的。
  3. 有些数据库管理系统的索引中根本没有足够的列来满足这种自然的键结构。
  4. 同样,对索引键的数据长度也存在长度要求。
  5. 最后,可变主键必须在整个系统中级联。

简而言之:

如果您的键值可能会发生更改,可能会更改

--信用卡号码或帐号是一个坏的主键,因为它可以改变,而名字是一个非常糟糕的选择

您有任何通过外键依赖于此表的数据(当需求出现时,重构此表非常容易)

先使用,然后使用

创建一个代理键作为主键。您已经找到了表的自然键,这很棒;在这些列上也放置了一个惟一的约束。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2289328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档