所有数据库表都应该有主键吗?

jus*_*inl 8 database primary-key

为每个数据库表提供主键是一种好习惯吗?在我看来,如果没有明确需要主键,那么它只会在我的数据库中更加混乱.

Nei*_*ell 13

你什么时候可能会:

在OLTP数据库中,您几乎总是(在我的情况下总是)拥有某种主键.有时Guid,有时是自动编号/身份字段,有时由应用程序或客户设置.有时甚至是多个领域的组合.这是因为您通常希望唯一地标识表中的任何给定行.

此外,主键是查询优化器使用的约束,它可以提高查找和连接的性能.

当你可能不会:

您没有主键的唯一时间是在"报告"表中,可能在非规范化数据仓库中.

  • 假设这些是将多个其他表连接在一起的多对多表,那么您可以使用代理键,或者更有可能将"父"ID值的组合视为PK. (2认同)

Ron*_*nis 5

是的,在每个表上都有一个主键是一种很好的做法。

但是,并不是每个表都应该有一个自动编号 id 列。我觉得有必要详细说明这一点,因为出于某种原因,即使已经存在一个非常好的候选者,很多人也倾向于在所有表中添加一个额外的 ID。例如,表示的多对多表Users <-> Groups应使用{user_id, group_id}.

除了在门口停止重复之外,主键约束还携带优化器在生成执行计划时使用的信息。

这就是为什么我总是,或者至少除了极少数例外,在我创建的所有表上都有一个主键。事实上,我什至在报告表上创建主键,其中大多数列都是主键的一部分。因为在开发过程中,我会因为我做错了什么而得到至少一个独特的约束违规。有了大量数据并且没有任何约束,我就不会发现错误。