php - 为什么 vbulletin 使用 ENUM?

标签 php mysql sql types vbulletin

今天,我和我的同事就在我们的项目中选择数据类型进行了一些辩论。
我们是网络开发人员,我们使用 PHP 编写后端代码,对于数据库,我们使用 mySQL。
所以,我上网了一下,他们出于各种原因不推荐 ENUM 数据类型(我也在这里读过所以不推荐这样做)——例如 ENUM('yes','no')你应该使用 tinyint(1) 。
如果 ENUM 不好并且应该避免,为什么 vBulletin 会使用它们?
当您可以使用 VARCHAR、TEXT 等并在 PHP 中强制使用 2 个可能值中的 1 个时,为什么还要使用它们。
感谢您的回答。

最佳答案

枚举并不理想,但它们waaaay比您使用 VARCHAR 并强制执行几个可能值之一的替代建议要好!

枚举将它们的数据存储为数值。这非常适合存储具有一组有限可能值(例如"is"或“否”)的字段,因为它使用最少的空间,并提供尽可能快的访问,尤其是对于搜索。

如果您稍后需要向列表中添加其他值,枚举就会失效。假设您需要有“可能”以及"is"或“否”。因为它存储在枚举中,所以此更改需要更改数据库。出于多种原因,这是一件坏事 - 例如,如果您有一个大型数据集,重建表可能会花费大量时间。

这个问题的解决方案是使用存储可能值列表的相关表,您的原始字段现在将只包含对新表的 ID 引用,查询将连接到查找表以获取字符串值。这称为“规范化”,被认为是良好的数据库实践。拥有大量这样的查找表是典型的关系数据库场景。

显然,如果您相当确定该字段绝不会存储"is"或“否”以外的任何内容,那么为它准备一个完整的额外表格可能有点矫枉过正,而枚举可能是合适的。

一些数据库产品甚至不提供 enum 数据类型,所以如果您正在使用这些数据库,您将不得不使用查找表解决方案(或者只是一个简单的数字字段,并映射您应用程序中的值)。

在这种情况下永远不合适的是在表中使用实际的字符串值。这被认为是不好的做法。

VARCHARS 比枚举使用的数值占用更多的磁盘空间。它们的阅读速度也较慢,在查询中查找速度也较慢。此外,它们删除了 enum 提供的固定值的实现。这意味着您的程序中的错误可能会导致无效值进入数据,使用 PHPMyAdmin 或类似工具的无意更新也可能如此。

希望对您有所帮助。

关于php - 为什么 vbulletin 使用 ENUM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6748356/

相关文章:

sql - 如何将 SQL 查询转换为关系代数?

mysql - 如何找到跨表的列的平均值?

php - 如果从MySql获取的数据小于*number*,则显示这个,否则显示其他内容?

php - Authorize.net 自动定期计费 (ARB) 的空响应

mysql - COUNT 次获胜次数和 MAX 次使用 MySQL 获胜次数最多的参与者

mysql - 在mysql中获取工作日字符串而不是数字

sql - 需要帮助将数据从一个表传输到同一数据库中的另一个表

javascript - 无响应 Ajax 请求 symfony2

php - 在 EntityRepository 中获取 Symfony 容器

当值为空时,MySQL 将字段设置为当前日期