每个MySQL表都应该有一个自动递增的主键吗?

时间:2011-09-07 21:59:52

标签: sql database database-design normalization

  • 我理解主键的价值。
  • 我理解索引的价值。

每个 MySQL表是否都有自动递增的主键(理想情况下是INT字段类型)?

更新

@Raj更多的回答似乎最有效。但是,当我考虑它时,问题是这个自动递增的主键ID将如何与其他表相关联。例如:

表1

ID  |   firstname  |   lastname | email
----------------------------------------
1   |    john      |   doe      | 1@email.com
2   |    sarah     |   stow     | 2@email.com
3   |    mike      |   bro      | 3@email.com

表2

ID  | memberid |    display      |    address
--------------------------------------------
1   |    1     | funtime zone    |   123 street
2   |    3     | silly place llc |  944 villa dr 

在上面的示例中,消费者可能会访问该网站并选择注册免费产品/服务。如果消费者选择,他们可以提供额外的信息(存储在表2中)以进行额外的邮寄等。我看到的问题是这些表如何与“主键自动增量字段”相关。在表2中,'memberid'与表1的ID有关,但这并非“非常”清楚。放入表2的任何新信息将增加1,而所有消费者将选择参与表2所需的数据。

3 个答案:

答案 0 :(得分:6)

我不是代理键的忠实粉丝。我还没有看到一个场景,我更愿意为数据库的每个表使用一个。

我会说

阅读以下答案: surrogate-vs-natural-business-keys


以上可能被视为讽刺或炽热(尽管有许多令人惊讶的赞成),所以它被删除了。

在一般情况下,代理和自然键上有很多问题和答案,所以我觉得这个问题更像是重复。我的观点是代理键很好并且非常有用,主要是因为自然键可以在连接表链的低端导致非常大的主键 - 许多RDBMS处理不好,聚簇索引变大等等但是说“ 每个 MySQL表应该有一个自动递增的主键”是一个非常绝对的陈述,我认为有些情况下他们真的提供很少或没有。

由于OP更新了问题,我将尝试对该特定主题发表评论。

我认为这恰好是自动增量主键不仅无用而且会增加负值的情况。假设table1table2处于1:1关系,memberid可以是Primary KeyForeign Keytable1

添加一个autoincrementing id列会添加一个索引,如果它是一个聚簇索引(如InnoDB PK索引),则会增加memberid索引的大小。更重要的是,如果你有这样一个自动递增的id,那么table2到其他表的一些JOIN将必须使用这个id(与{2}中的表{JOIN连接到表2)和一些使用1:nmemberid1:n关系中的表的连接)。如果您只有table1这两种类型的JOIN都可以 使用memberid完成。

答案 1 :(得分:3)

我是代理键的忠实粉丝。我还没有看到一个我不想使用的场景。

我会说

阅读此答案Surrogate vs. natural/business keys

修改

我会改变我的回答,包括以下内容:

在某些情况下,我现在使用实际值作为代理键:

DimDate (20151031, 20151101, 20151102....) DimZipCode (10001, 10002, 10003...)

其他所有内容都会获得代理密钥。

答案 2 :(得分:1)

是的,有一个例外:

在两个其他表(纯链接表)之间实现n:m关系的表,如果只有两个字段,则不需要这样的字段,引用链接表的两个主键。然后,链接表的主键由两个字段组成。

只要链接表有额外信息,就需要一个简单的单字段主键。

话虽如此,可能会有更多例外;数据库设计是一个非常广泛的领域...

编辑:在上一句中添加 more