如何在mysql规范化数据库中使用PRIMARY KEY

时间:2011-10-25 01:25:31

标签: mysql database relational-database normalization

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

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

Fred   Gladiator
Brian  Godfather
Fred   Godfather

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

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

在任何现实世界的场景中,两个表(电影和人物)将拥有更多列(如movies.year,persons.lastname,persons.firstname等)。在这种情况下,在每个表中都有一个主键列是有意义的(也可以是非自动增量列,例如movies.name),用于多对多关系。

但如果情况与您建议的那样微不足道,那么您的解决方案应该足够好。我不认为你提到的劣势真的会引起关注。

阿迪蒂亚

答案 1 :(得分:1)

我发现了许多潜在的问题:

  • 你如何区分多个Freds?
  • 如果电影或人改名,会发生什么情况(电影正在开发时很常见)?现在你必须去确保引用它的每个表都被更新,而ID将保持不变。

答案 2 :(得分:1)

  

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

我认为通常是cargo cult programming

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

有关某些测量值,请参阅this recent SO answer

不要猜。测量