【发布时间】:2011-12-16 03:32:36
【问题描述】:
我应该实现读取数据库规范化(使用连接表)还是应该将 ENUM 类型用于静态或动态数据?
例如:
我有一张桌子USER 和user_status。我应该创建一个表 status 表还是创建一个包含状态的 ENUM 列表?
谢谢大哥
【问题讨论】:
标签: mysql enums database-normalization
我应该实现读取数据库规范化(使用连接表)还是应该将 ENUM 类型用于静态或动态数据?
例如:
我有一张桌子USER 和user_status。我应该创建一个表 status 表还是创建一个包含状态的 ENUM 列表?
谢谢大哥
【问题讨论】:
标签: mysql enums database-normalization
恕我直言,枚举扩展使将语义嵌入到表中变得更加容易,并且还通过以下方式提高了效率:
我知道的唯一缺点是
HTH
C.
【讨论】:
ENUM 还有其他问题。一方面,所有ENUM 列都可以采用空字符串的特殊“未知”值(如果允许,除了NULL);此外,除非使用严格的 SQL 模式,否则此值将用于任何无效值的分配。这可能导致意外的数据库不一致;此外,如果在ENUM 列表中确实有一个明确的空字符串值,这可能会导致巨大的混乱(因为必须检查数值以确定存储的空字符串的“类型”)。
ENUM 值时。该手册提供了一个很好的ENUM 列表('0','1','2') 示例:“如果您存储2,它会被解释为一个索引值,并变为'1'(索引为2 的值)。如果您存储'2',匹配一个枚举值,所以存储为'2',如果存储'3',它不匹配任何枚举值,所以它被当作一个索引,变成'2'(值索引为 3)。"
ENUM 可能会在排序上下文中引起混淆,因为值是根据它们在 ENUM 列表中的位置排序的(而期望值可能会按字典顺序排序)。虽然我不会像 Chris Komlenic 的 8 Reasons Why MySQL's ENUM Data Type Is Evil 那样走得那么远,但我当然认为他的文章值得一读以了解问题;而且,考虑到加入正确索引的表应该比ENUM 更有效(如果不是更有效),我认为这些优势并不那么“真实”。
要考虑的其他东西......
只能通过修改其他地方的数据库结构来更新枚举,而链接表允许动态创建记录。
【讨论】:
这取决于架构和许多其他因素。
例如,您不允许读取/写入数据,除非使用存储过程。在这种情况下,您可以随意使用“tinyint”数据类型。如果您允许使用直接查询进行读/写,最好使用约束,即 ENUM 以避免不正确的状态(如果 UI 或后端当然可以放置这种“错误”状态)。
另一方面(也有可能)数据流可能会发生变化,您可能需要添加新的状态。在这种情况下,您将需要: 1)如果你有静态数据类型,什么也不做; 2) 如果您有 ENUM,请进行更改。
所以...我的回答是:这取决于您的应用程序和您的要求。
【讨论】: