【问题标题】:How to use PRIMARY KEY in mysql normalized database如何在mysql规范化数据库中使用PRIMARY KEY
【发布时间】:2011-12-14 14:03:36
【问题描述】:

多对多关系的一般形式是创建三个包含两列的表(例如关联成员最喜欢的电影)。两张表是电影和成员的列表。在这两个表中,我们分配了一个auto_increment ID(即主键)。然后将这两个ID的关系存储在第三个表中。

我想知道为什么我们对这两列使用 ID?我们可以有两个单列表作为电影和人物的列表;然后创建将电影与人相关联的关系表:

Fred   Gladiator
Brian  Godfather
Fred   Godfather

此方法的唯一缺点是搜索仅整数表更容易找到关系。相反,我们减少了两个索引列。

有什么想法吗?

【问题讨论】:

标签: mysql database relational-database normalization


【解决方案1】:

我想知道为什么我们对这两列使用 ID?

我认为通常是cargo cult programming

  • 如果您无法在没有任意、无意义的 id 编号的情况下将 Fred 与另一位区别开来,那么您将无法将一个 Fred 与另一个 使用任意、无意义的 id 编号区分开来。
  • 如果您预计其中一个名称会发生​​变化,那么您应该级联更新。 (许多 Oracle 开发人员坚持认为键必须是不可变的。这并不是因为可变的自然键“不好”;而是因为 Oracle 不支持 ON UPDATE CASCADE。)
  • 有一种普遍的但不正确的观点认为 id 编号只是“更快”,可能是因为 dbms 引擎“针对 id 编号的连接进行了优化”。 id 编号在连接中是否更快取决于表的宽度、自然键的内容、行数、所需的连接数、页面大小和查询的性质。经常被忽视的是使用自然键通常会减少连接的数量。有时,自然键会消除所有连接,即使在 5NF 中的表中也是如此。

请参阅this recent SO answer 了解一些测量结果。

别猜了。测量。

【讨论】:

    【解决方案2】:

    在任何现实世界的场景中,这两个表(电影和人物)都会有更多的列(如电影.年份、人物.姓氏、人物.名字等)。在这种情况下,对于多对多关系,在每个表中都有一个主键列(也可以是非自动增量列,例如 movies.name)是有意义的。

    但如果情况像您建议的那样微不足道,那么您的解决方案应该足够好。我不认为你提到的缺点真的是一个问题。

    阿迪亚

    【讨论】:

      【解决方案3】:

      我看到了一些潜在的问题:

      • 如何区分多个 Fred?
      • 如果电影或人更改名称会发生​​什么(在电影开发中很常见)?现在您必须确保引用它的每个表都已更新,而 ID 将保持不变。

      【讨论】:

      • 真的很不错。大多数时候我们处理唯一值(例如,用户名而不是名称);但第二个问题是绝对正确的。
      猜你喜欢
      • 1970-01-01
      • 2011-12-16
      • 2013-07-17
      • 1970-01-01
      • 2017-02-25
      • 2011-05-18
      • 1970-01-01
      • 2011-11-12
      相关资源
      最近更新 更多