在 MySQL 中使用 ENUM 和规范化类型表的正确时间是什么?

ran*_*omx 8 mysql database-design

可能的重复:
使用 ENUM 与 Integer 类型的优缺点?

仅考虑 MySQL...

我很想知道社区认为 ENUM 类型与 FK 到类型表的正确用例是什么。

我读过这个问题:使用 ENUM 与 Integer 类型的优点和缺点?,但是用例对我来说并没有得到很好的覆盖。

Rol*_*DBA 5

当使用 ENUM 获得一系列值时,您必须正确计划将使用哪些值。一旦这些值就位,如果您想重新定义 ENUM 范围,执行任何类型的简单维护都会变得相当具有挑战性。

虽然您可以执行诱饵和切换技巧来扩展 ENUM 的范围,但如果您想做其他事情,例如减少或更改 ENUM 范围,这些相同的技巧就会变得非常麻烦(甚至可能是不可能的)。

当您知道正在建立的类型可以扩展、减少或更改时,使用外键就非常有意义。只需将新条目添加到具有所需类型的表中,键就可以传递到其他表,而无需担心底层值在外部表中是否正确表示。此外,您不会担心这些值与类型的基表定义完全匹配。如果使用 ENUM,这种担忧肯定会适用。

外键约束将用于保护行免于吸收无效类型。因此,这不适用于 ENUM,因为约束检查必须在您的应用程序中完成,而不是在数据库中完成。

以下是关于 ENUM 使用应考虑的事项:

ENUM 在以下情况下效果最佳

  • 您所代表的类型仅适用于表
  • 它必须代表一个永远不会改变的类型
  • 它永远不会经历重新定义
  • 它的基数需要低
  • 它的可移植性必须始终基于表的逻辑转储,而不是物理转储。否则,ENUM 的使用必须伴随着诱饵和开关的维护方法。
  • 您可以允许 NULL(例如:game_rating ENUM('EC','E','E10+','T','M','A') NULL这允许在没有默认评级的情况下将新游戏输入到表格中)

警告

OK game_rating 可能是一个不好的例子,因为ESRB可以创建更多的游戏评级。在这种情况下,FK 会更好,但基表必须将 'unknown' 作为默认类型并将 game_rating 定义为NOT NULL