我应该使用没有GUID的自然身份列吗?

时间:2009-03-29 20:32:57

标签: sql primary-key

使用2个外键列定义表主键是否可以是唯一的?因此不添加新的id列(Guid或int)?

这是否有负面影响?

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

自然与人工主键是受到广泛争论的问题之一,恕我直言,讨论似乎只是看到立场变硬。

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

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

答案 2 :(得分:0)

对于某些“ok”的定义,是的。只要您从不打算在此交集表中添加其他字段,那就没问题了。但是,如果您打算有更多字段,最好有一个ID字段。它仍然很好,想到它,但可能更尴尬。

当然,除非磁盘空间非常重要!

答案 3 :(得分:0)

如果你查看任何数据库教科书,你会发现这样的表格。这是定义n到m关系的默认方式。例如:

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

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

答案 4 :(得分:0)

是的,我同意,“一些OK定义”没关系。但是当你决定从某个地方引用这个复合主键时(即将它移动到一个外键),它很快就会变成NG(不好)。