何时在MySQL中使用外键?

9
是否有官方指导或阈值来表明在MySQL数据库中使用外键的最佳实践?
假设您创建了一个电影表。一种方法是将制片人和导演数据集成到同一张表中(movieID,movieName,directorName,producerName)。
然而,假设大多数导演和制片人都参与过许多电影。创建两个其他的表用于制片人和导演,并在电影表中使用外键是否更好呢?
什么时候才是最佳实践?当许多导演和制片人在列中出现多次时?还是从一开始就采用外键方法最佳?虽然使用外键看起来更有效率,但也增加了数据库的复杂性。
那么,何时在复杂性和规范化之间进行权衡是值得的?我不确定是否存在特定数量的单元格重复使使用外键更合理的阈值。
我正在考虑一个将被数百个用户同时使用的数据库。
非常感谢!
2个回答

12

关于此事有一些官方指南,它们被称为规范化形式,将数据库放入其中的实践被称为规范化: http://en.wikipedia.org/wiki/Database_normalization

如果你在大学里学习数据库课程,他们可能会教你3NF或BCNF。我总是觉得这些方法有点武断,但我在数据库设计方面拥有足够的经验,觉得这类问题基本上是直观的...

在你的例子中,你肯定要使用外键约束。一个多对一的关系最好用这种方式表示。这将使选择电影有点慢,因为你将不得不在“people”表和“movies”表上进行联接 - 可能会有很多联接,这取决于“movies”表有多少“people”字段。

但优点是你可以轻松管理人员自身。如果你想改变一个人的姓名拼写,你不必在每个字段中扫描整个表格寻找那个人。你可以避免在数据库中多次使用略有不同的姓名拼写的同一个人。你可以设置删除人员时要采取的动作。你可以轻松计算一个人担任过多少不同的角色。

不要忘记,如果你想使用外键,你必须将你的表在mysql中设为InnoDB。


1
好的帖子。只是为了明确,你可以在MyISAM中实现外键。它们只是不会被强制执行 - webbiedave

4
假设你创建了一个电影的表。一种方法是将制片人和导演数据整合到同一个表中。(电影ID、电影名称,导演名字,制片人名字)。
这太不规范了,你在重复数据。
不过,假设大多数导演和制片人都参与了很多电影制作。是否最好为制片人和导演分别创建两个表,并在电影表中使用外键?
另外,有时一个人可能会在一部电影中担任制片人,在下一部电影中担任导演。一位单一的人也可以因为在一部电影中担任导演、制片人、编剧和演员而被认可!
那么,什么时候最好这样做呢?当许多导演和制片人在同一列中出现多次时?还是从一开始就采用外键方法是最佳实践?虽然使用外键似乎更有效率,但它也增加了数据库的复杂性。
你需要从一开始就掌握外键、关系(尤其是一对多和多对多)和规范化。它们将很快变成第二天性技能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接