0

可以用 2 个外键列定义表主键,这些列的组合必须是唯一的吗?因此不添加新的 id 列(Guid 或 int)?

这有负面影响吗?

4

5 回答 5

4

是的,完全没问题。为什么不?复合主键的缺点是它可能很长,并且从应用程序的角度可能更难唯一地识别单个行。但是,对于几个整数列(特别是在联结表中),这是一个很好的做法。

于 2009-03-29T20:37:54.937 回答
1

自然主键与人工主键是引起广泛争论的问题之一,恕我直言,讨论似乎只是让立场变得更加坚定。

在我看来,只要开发人员知道如何避免两者的缺点,两者都可以工作。自然主键(无论是复合列还是单列)更接近于确保不会将重复行添加到数据库中。而使用人工主键时,必须首先检查记录是否唯一(与人工主键相反,主键始终是唯一的)。实现此目的的一种有效方法是在使记录唯一的字段上具有唯一或候选索引(例如,使主键候选的字段)

同时人工主键便于加入。可以使用单个字段到单个字段连接来建立关系。使用复合键,SQL 语句的编写者必须知道要在连接中包含多少字段。

于 2009-03-29T20:45:44.793 回答
0

对于“ok”的一些定义,是的。只要您从不打算向此交集表添加其他字段,就可以了。但是,如果您打算拥有更多字段,最好使用 ID 字段。想想还是不错的,但可能会更尴尬。

当然,除非磁盘空间非常昂贵!

于 2009-03-29T20:39:00.130 回答
0

如果您查看任何数据库教科书,您会发现大量此类表。这是定义 n 对 m 关系的默认方式。例如:

article = (id, title, text)
author = (id, name)
article_author = (article_id, author_id)

从语义上讲,article_author 不是一个新实体,因此您可以避免将其定义为主键,而是将其创建为具有 UNIQUE 约束的普通索引。

于 2009-03-29T20:40:27.130 回答
0

是的,我同意,“一些好的定义”是好的。但是,当您决定从某个地方引用此复合主键(即,将其移至外键)时,它很快就会变成 NG(不好)。

于 2009-03-29T20:42:39.760 回答