代码之家  ›  专栏  ›  技术社区  ›  Mohamad

在MySQL中何时使用外键

  •  9
  • Mohamad  · 技术社区  · 15 年前

    在MySQL数据库中,是否有官方指导或阈值来指示何时使用外键是最佳实践?

    假设您为电影创建了一个表。一种方法是将生产者和导演数据集成到同一个表中。(movieid、moviename、directorname、producername)。

    然而,假设大多数导演和制片人都在拍许多电影。是否最好为制片人和导演创建两个其他表,并在电影表中使用外键?

    什么时候成为最佳实践?当许多导演和制片人多次出现在专栏中时?或者在开始时采用外键方法是最佳实践?虽然使用外键似乎更有效,但它也增加了数据库的复杂性。

    那么,在复杂性和正常化之间的权衡何时变得值得呢?我不确定是否有一个阈值或一定数量的单元格重复,使使用外键更为明智。

    我正在考虑一个数据库,它将被数百个用户同时使用,其中许多用户同时使用。

    多谢!

    2 回复  |  直到 15 年前
        1
  •  12
  •   Igor Serebryany    15 年前

    有一些官方的指导方针。它们被称为正常形式,将数据库放入其中的做法被称为规范化: http://en.wikipedia.org/wiki/Database_normalization

    如果你在大学上DB课程,他们可能会教你3NF或BCNF。我一直觉得这些方法有点笨手笨脚,但我在数据库设计方面有足够的经验,我发现这些问题在这一点上基本上是直观的…

    在您的示例中,您肯定希望使用外键约束。多对一的关系最好用这种方式表达。这会使选择电影的速度变慢,因为您必须在“人物”表和“电影”表上进行连接-根据电影表中有多少“人物”字段,可能需要进行许多连接。

    但好处是你可以很容易地管理人们自己。如果要更改人名的拼写,则不必扫描整个表,在每个字段中查找该人。你可以避免同一个人多次出现在数据库中,但在拼写上有细微差别。如果某人被删除,您可以设置要采取的操作。你可以很容易地计算一个人有多少不同的角色。

    别忘了,如果你想使用外键,你必须在mysql中使你的表成为innodb。

        2
  •  4
  •   webbiedave    15 年前

    假设您为创建了一个表 电影。一种方法是 整合制片人和导演 数据到同一个表中。(电影) moviename,目录名, 产品名称)。

    这太不规范了。你在重复数据。

    然而,假设大多数董事和 制片人制作了许多电影。 最好再创造两个 制片人和导演的表格, 在电影中使用外键 桌子?

    另外,假设一个人可以在一部电影中担任制片人,在另一部电影中担任导演。一个人也可以被认为是导演,制片人,作家和演员在一部电影!

    什么时候成为最佳实践 这样做吗?当许多董事 生产商也出现了几个 列中的时间?还是最好的 使用外键的练习 一开始就接近?虽然看起来 更有效地使用外键, 它还提高了 数据库。

    您将希望从一开始就掌握外键、关系(尤其是一对多和多对多)和正常形式。它们很快就会变成第二天性。