为什么vbulletin使用ENUM?

时间:2011-07-19 13:58:59

标签: php mysql sql types vbulletin

今天,我与我的同事就我们的项目中选择数据类型进行了一些辩论。 我们是Web开发人员,我们使用PHP编写后端代码,对于数据库,我们使用mySQL 因此,我上网了一点,并且由于各种原因他们不建议使用ENUM数据类型(我也在这里读到了这不推荐) - 对于ENUM('是','否')例如你应该使用tinyint(1)。
如果ENUM是坏的并且应该避免,为什么vBulletin例如使用它们? 为什么在使用VARCHAR,TEXT等时可以使用它们,并强制使用PHP中2个可能值中的1个。
谢谢你的回答。

1 个答案:

答案 0 :(得分:3)

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

枚举将其数据存储为数值。这非常适合存储具有有限可能值集合的字段,例如“是”或“否”,因为它使用最小的空间量,并提供最快的访问权限,尤其是对于搜索。

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

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

显然,如果你非常确定该字段永远不会存储除“是”或“否”以外的任何内容,那么为它添加一个额外的表并且枚举可能是适当的可能是过分的。

某些数据库产品甚至不提供enum数据类型,因此如果您使用这些数据库,则必须使用查找表解决方案(或仅使用简单的数字字段,并将值映射到你的申请)。

在这种情况下,从不适当的是在表中使用实际的字符串值。这被认为是非常糟糕的做法。

VARCHARS占用的磁盘空间远远大于枚举使用的数值。它们读取速度也较慢,查询速度较慢。此外,他们还删除了enum提供的固定值的强制执行。这意味着程序中的错误可能导致无效值进入数据,使用PHPMyAdmin或类似工具进行的无意更新也是如此。

我希望有所帮助。