Sql 我应该使用没有GUID的自然标识列吗?

Sql 我应该使用没有GUID的自然标识列吗?,sql,primary-key,Sql,Primary Key,定义表主键和2个外键列的组合必须是唯一的,可以吗?因此不添加新的id列(Guid或int) 这有负面影响吗?是的,完全可以。为什么不呢?复合主键的缺点是它可能很长,而且从应用程序的角度来看,可能更难唯一地识别一行。但是,对于两个整数列(特别是在连接表中),这是一个很好的做法。是的,完全可以。为什么不呢?复合主键的缺点是它可能很长,而且从应用程序的角度来看,可能更难唯一地识别一行。但是,对于两个整数列(特别是在连接表中),这是一个很好的做法。对于“ok”的某些定义,是的。只要您不打算向这个交集表添

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


这有负面影响吗?

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

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

对于“ok”的某些定义,是的。只要您不打算向这个交集表添加额外的字段,就可以了。但是,如果您想要有更多的字段,最好有一个ID字段。想想看,这仍然很好,但可能会更尴尬

当然,除非磁盘空间非常宝贵

对于“ok”的一些定义,是的。只要您不打算向这个交集表添加额外的字段,就可以了。但是,如果您想要有更多的字段,最好有一个ID字段。想想看,这仍然很好,但可能会更尴尬


当然,除非磁盘空间非常宝贵

如果你查阅任何数据库教科书,你都会发现这样的表格非常多。这是定义n-to-m关系的默认方式。例如:

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

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

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

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

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

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

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

自然主键与人工主键是引起广泛争论的问题之一,在讨论中似乎只看到立场变硬

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


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

自然主键和人工主键是引起广泛争论的问题之一,而且在讨论中似乎只看到立场变得强硬

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


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

一个人工键可能使联接更容易,但它通常也需要更多的联接,因为您必须通过一系列人工ID遍历一系列关系。“…需要更多的联接…”-这是错误的陈述。它需要相同数量的连接,但需要更多的字段。一个人工键可能更容易连接,但它通常也需要更多的连接,因为您必须通过一系列人工ID遍历一系列关系。“…需要更多的连接…”-这是错误的陈述。它需要相同数量的联接,但需要更多的字段。