【问题标题】:To use auto-increment in MySQL or not?是否在 MySQL 中使用自动增量?
【发布时间】:2011-11-24 20:53:00
【问题描述】:

我已经阅读了某些地方,通常对大多数 MySQL 表使用自动递增的主键是一种很好的做法,而不是简单地依赖将被强制为唯一的非递增字段。

我的问题是关于一个用户表,以及一个通过外键连接到它的表。这是架构:

TABLE Users {
    id
    name
    ...
}

TABLE Authors {
    user_id (FK)
    author_bio
}

Authors 表是否也应该有自己的自增主键,还是应该依赖 user_id 外键作为主键?

是否有明显的性能原因不使用自动递增的 id 作为主节点?

【问题讨论】:

  • 使用USERS 表的主键作为AUTHORS 表的主键建议1:1 的关系。规范化(3NF?)规定在这种情况下不应该有两个表。添加单独的主键(是否自动递增)不会改变...
  • OMG - 用户可能是作者,但作者将是用户。是这个意思吗?
  • 不,如果只有一个 USER 与单个 AUTHOR 记录相关 - 即 1:1。该决定取决于您的业务规则,但众所周知,作者有化名(别名) - IE:Steven King 写成 Richard Bachman
  • 我的天啊,不过,我认为把所有东西放在一张桌子上效率很低。就我而言,也许每 100 个帐户中就有 1 个是作者。这意味着 User 表中会有很多空字段没有分隔......对吗?

标签: mysql primary-key auto-increment


【解决方案1】:

这不是非此即彼。如果您使用自增主键,并且您有需要强制约束的候选键,那么您的架构应该同时具有这两者。

userauthor 表都应该有单独的主键。 (每个表都必须有一个主键。)我不会使用外键作为主键。如果真的是这样,我就不会有单独的作者表;我会将这些列放在用户表中。

PS - 我对表格的命名偏好是单一的。它应该是 userauthor 表。它们恰好包含多行,但单行意味着单个实体。

【讨论】:

  • 所以你是说拥有一个自动递增的主节点,然后是外部节点很酷,即使外部节点是唯一的并且可以(技术上)用作主节点?每个表都有我喜欢的自动递增键的一致性。
  • Duffy,感谢您的详细说明...我认为我同意您的想法...知道每个表都会有一个主键类型的公共线程,这让我感觉更清楚
【解决方案2】:

您绝对希望Authors 表有自己的主键,例如authors_id,然后将user_id 作为外键。

【讨论】:

  • 您能否详细说明原因,以便我了解其要点?
【解决方案3】:

这取决于您要完成的工作。如果每个作者都映射到一个用户(并且您确定这不会改变),您可以使用 user_id 作为主键。如果没有,您将需要一个独立的 Authors 主键。

(请注意,反向关系不一定是真的:不是每个用户都必须映射到作者。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多