因此,我与一位同事在使用枚举与查找表方面存在分歧。
这篇 2011 年的非常古老的文章和 MyQL5.5仍然被那些不喜欢枚举的人一次又一次地引用。
但是我们在不是那么大的数据库上使用 MySQL8.0,比如 50 到 60 个表,有 30 个枚举列。
一些表有几百万行,大多数都低于 500K 行。
几乎所有枚举的值都少于 10 个,并且只有极少数在其生命中发生了变化(一次),总是在可能值的末尾添加一个新值。
而且我们从来没有“遭受”过文章提到的任何缺点,比如将元数据存储在旁边,从其他表中引用相同的值等等......
尽管文章在第 2 点说了什么,但今天,在列表末尾添加一个值并不会更新整个表,但删除一个值总是会更新(或至少读取)所有行。
我确实知道有两个学派,我了解两者的优点和缺点。
但是,今天在 MySQL8 上,是否存在任何实际/事实/技术原因,所以**从现有列的枚举切换并证明应用程序和数据库中的所有工作都需要这样做?
感谢您的阅读和您的回答。
MySQL 5.5 和 8.0 之间没有任何改变,使得 ENUM 比以前更加邪恶。
我认为称其为“邪恶”是夸张的。编程语言特性并不邪恶。但它可能会被不了解其缺点的开发人员滥用。然后他们遇到了麻烦。
如果您拥有的 ENUM 列对您来说运行良好,并且您当前的项目没有受到不利影响,那么没有理由切换它们。
在设计新表格时,牢记利弊是一件好事。在一个表中使用 ENUM 可能工作正常,而在同一个项目的另一个表中使用它会与其中一个问题发生冲突。这取决于如何使用每个表。
我在我的书SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming的一章中写了更多关于 ENUM 的内容。
不幸的是,我是那些看到鲜血就畏缩的人之一,呃...... ENUMs。我在 10.5 年前引用了同一篇文章:使用 ENUM 与整数类型的优点和缺点?
我与 ENUM 的唯一主要问题是为 ENUM 类型声明的值的顺序。如果您不断添加新值,请不要更改值的顺序。继续追加新值。如果你重新排列值的顺序,现在邪恶就出现了。价值观的背景可能会非常迅速地向南发展。
您可以通过将数据类型更改为 VARCHAR、自行更改值,然后将数据类型更改回 ENUM 来缓解此类问题。这样,由 ENUM 表示的值的上下文将保持稳定。我已经看到一两个客户端在 5.7 中没有问题,所以我真的不明白为什么 8.0 会有任何问题。