数据库表是否应始终具有主键?

16 database modeling primary-key

我的数据库表中是否应该始终有主键?

我们来看SO标签吧.您可以在任何修订中看到该标记,它可能位于带有postID和修订号的tag_rev表中.我需要PK吗?

此外,因为它在转换表中并且当前没有使用标签应该是一个tagID而不是多个post_id tagid对的多个条目?

Meh*_*ari 10

一个应该有一个主键,以便你能唯一标识每一行吧.

从技术上讲,您可以拥有没有主键的表,但是您将破坏良好的数据库设计规则.

  • @Cyber​​herbalist:即使在这种情况下,如果您以编程方式使用该表,您可能需要一种方法来分别识别每一行.另请注意,拥有主键并不意味着具有*单独的*主键*列*.您可能将列组合作为主键.顺便说一句,当你认为在你的具体情况下没有意义时跳过模式和规则是完全有效的,但绝大多数情况下,没有主键伤害. (2认同)

Rob*_*Rob 9

您应该努力在任何非平凡的表中使用主键,您可能希望通过该键访问(或更新或删除)单个记录.主键可以包含多个列,从形式上讲,它将是最短的可用超级键; 也就是说,最短的可用列组,它们一起唯一地标识任何行.

我不知道Stack Overflow数据库架构是什么样子的(以及我在Jeff的博客上读过的一些我不想要的东西),但是在你描述的情况下,完全有可能存在一个主要的密钥对帖子标识符,修订号和标签值; 当然,这将是最短(也是唯一)的超级密钥.

关于你的第二点,虽然支持在归档表中聚合值可能是合理的,但它确实违背了表中每个行/列交集应该包含一个单独值的原则.虽然它可能会略微简化开发,但没有理由不能保留带有版本化元数据的规范化表,即使对于像标记这样微不足道的东西也是如此.