没有表的'id'主键是不是一个好主意?

时间:2011-01-21 13:37:19

标签: sql mysql

在我看来,它总是一个好主意,但有没有一个案例,你最好没有这个在桌子上?

7 个答案:

答案 0 :(得分:6)

通常情况下,你应该有某种PRIMARY KEY

当您不想要时,有一些非常特殊的情况,尤其是堆组织(非群集)的日志表,它们没有任何索引来加速插入。< / p>

请注意,在MySQL中,InnoDB表不能进行堆组织,因此这只涉及MyISAM个表。

另请注意,PRIMARY KEY可以是复合的,就像在many-to-many关系表中一样。在这样的表中,您不会有id列,但是您将拥有一个由相关表的id列组成的复合主键。

有关详细信息,请参阅此问题:

答案 1 :(得分:4)

简答:是的。

更长的答案:如果你有一个用于多对多关系的表,你真的不需要主键。那么它可以被视为浪费空间。可能有更多的例子,这只是答案“是”的一个证据: - )

答案 2 :(得分:2)

根据我的经验,几乎从不。 (对于“速度很重要,我只是插入并且并不真正关心此时的检索”或许应用方式。)

虽然你可能想象永远不会使用ID字段,但是让一个人愉快地去掉AUTO_INCREMENT的话几乎总是明智的,因为有一天你可能需要一个。 (你当然可以简单地做一个'ALTER ..'来添加一个,但这不仅仅是重点。)

答案 3 :(得分:2)

拥有主键是一个好主意(如果你想要一个完全规范化的数据库设计,这是必要的。)

就个人而言,如果表格中有一个自然候选键,我会在大部分时间使用它,而不是添加必须人工填充的ID列。

答案 4 :(得分:1)

适用于first normal formsecond normal form的数据库。

答案 5 :(得分:0)

对于性能/空间,如果可能,我会避免使用自动编号ID字段。如果你有一个非常大的表(数百万或数十亿条记录),那么空间很重要。如果您可以根据其他字段(或字段)找到一个好的,可用的主键,那么最好使用它而不是引入ID字段。

如果您可以使用一组具有唯一索引作为主键的字段,则无法使用自动编号主键。您只需要小心UPDATE以保持参照完整性。

答案 6 :(得分:0)

这取决于您的数据设计以及您访问表格中数据的方式。

日志表通常不需要主键,因为您经常访问组中的日志而不删除/编辑单个消息(您可以清除整个表或日志的时间窗口。)

其他时候,ID字段可能是多余的。如果客户使用OpenID(或简称电子邮件地址)订阅您的网站,那么您已拥有主键。但是,在这种情况下,添加冗余ID字段是一个好习惯,因为整数使用的空间比字符串少,并且您应该在实体所涉及的所有关系中重复ID!

最后,在99%的情况下,关系表不需要显式ID。示例:用户之间的多对多关系。关系表仅包含用户ID和组ID,而 是您的主键(您希望分别为这两个字段编制索引以获得性能...)。

顺便说一句,自动递增ID不会显着降低性能。计数器值存储在表的元数据中,因此当DBMS执行插入时,它会自动递增引用计数器,这可以使用等效的Java AtomicInteger和C#的Interlocked完成,所以你不要不得不担心它!