Sql 在使用代理键的情况下是否有单独的表?

Sql 在使用代理键的情况下是否有单独的表?,sql,join,indexing,view,surrogate-key,Sql,Join,Indexing,View,Surrogate Key,我一直在阅读Stack Overflow和其他网站上关于复合键和代理键的激烈辩论,尽管对给出的一些论点感到困惑,但我觉得我知道每种方法的优缺点 我很想得到代理密钥,但现在我有另一个问题。让我解释一下我的情况。我有一个由5个整数组成的表,它们组成了一个唯一的组合,我有几个表引用这个实体。现在所有的表都包含完整的5个字段,所有的连接操作都必须将所有的5个字段作为连接标准。现在我添加了一个代理密钥。但是我是否应该从所有表中删除所有5个字段,以使用引用“main”表的代理外键 我不确定是否要这样做,因为

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

我很想得到代理密钥,但现在我有另一个问题。让我解释一下我的情况。我有一个由5个整数组成的表,它们组成了一个唯一的组合,我有几个表引用这个实体。现在所有的表都包含完整的5个字段,所有的连接操作都必须将所有的5个字段作为连接标准。现在我添加了一个代理密钥。但是我是否应该从所有表中删除所有5个字段,以使用引用“main”表的代理外键

我不确定是否要这样做,因为这5个字段中的每一个都经常被用作其他表中的选择标准。我在它们上面定义了索引,按照一定的自然顺序,因此选择操作执行得很快。如果我将所有5个字段迁移到一个单独的表中,我担心当我想选择其中的前三个字段时,我必须定义一个连接并从中进行选择,但由于该连接刚刚生成,因此没有在该连接上定义索引,我将遭受性能损失

或者我应该为每个表(包括5个键)定义一个视图,并在其上建立索引吗

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

除非您对引入代理键有一个非常具体的目标,否则只要它对您有效,我可能就不使用它。

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

Hm,是的,然后我可以在这一列上放置索引并与其他表连接,这样我的过滤器也会很快。我将尝试这两种方法并比较性能。