sql - 如果有代理键,需要单独的表吗?

标签 sql join indexing view surrogate-key

我一直在 Stack Overflow 和其他网站上阅读关于复合键与代理键的激烈辩论,尽管对给出的一些论点感到困惑,但我觉得我知道每个论点的优缺点。

我很想寻找代理键,但现在我有另一个问题。让我解释一下我的情况。我有一个由 5 个整数组成的表,这些整数组成了一个唯一的组合,并且我有几个引用该实体的表。现在,所有表都包含完整的 5 个字段,并且所有 JOIN 操作都必须提及所有 5 个字段作为连接标准。现在我添加了一个代理键。但是我应该从所有表中删除所有 5 个字段,转而使用引用“主”表的代理外键吗?

我对这样做感到不确定,因为这 5 个字段中的每一个字段都经常单独用作其他表中的选择标准。我以某种自然顺序在它们上定义了索引,以便选择操作执行得很快。如果我将所有 5 个字段迁移到一个单独的表中,恐怕当我想要选择其中的前三个字段时,我必须定义一个 JOIN 并从中选择,但不会定义任何索引因为 JOIN 刚刚生成,所以我会遭受性能损失。

或者我应该以某种方式为每个表定义一个 VIEW,包括 5 个键及其索引?

我感到困惑,在输入所有这些内容后,倾向于再次坚持使用自然键。 帮忙?

最佳答案

我建议使用一张包含 5 个唯一字段 + 代理主键的表。在该表中,您可以在每个字段上创建索引 + 5 个字段上的唯一约束。然后,您将只有 1 列,而不是其他表中的 5 个字段。

关于sql - 如果有代理键,需要单独的表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2202508/

相关文章:

python - 在 Pandas 中拆分和加入系列

javascript - 如何使用 nodejs sdk 在 cosmos db 中定义正确的索引路径?

python - 通过 Javascript 添加 Mongo 索引

java - Java swing 中单击的 JButton 的返回索引

sql - Oracle - 用句号表示千位,用逗号表示小数点

PHP ORDER BY 不工作嵌套查询

sql - Visual Studio 2012 无法在 Asp.net 网站中保存我的 SQL 数据库

MySQL 合并表,值为零

c# - SQL TO Linq,如何返回对象并填充属性

需要 SQL 语句