今天,我和我的同事就在我们的项目中选择数据类型进行了一些辩论。
我们是 Web 开发人员,我们使用 PHP 编写后端代码,而对于数据库,我们使用 mySQL。
所以,我上网了一下,出于各种原因,他们不推荐 ENUM 数据类型(我也在这里读过,所以不推荐这样做) - 例如 ENUM('yes','no')你应该使用 tinyint(1) 。
如果 ENUM 不好并且应该避免使用,为什么 vBulletin 会使用它们?
当您可以使用 VARCHAR、TEXT 等并在 PHP 中强制使用 2 个可能值中的 1 个时,为什么还要使用它们。
谢谢您的回答。
1 回答
枚举并不理想,但它们比您使用 VARCHAR 并强制执行几个可能值之一的替代建议要好得多!
枚举将其数据存储为数值。这对于存储具有一组有限可能值(例如“是”或“否”)的字段是理想的,因为它使用最少的空间,并提供最快的访问,特别是对于搜索。
如果您以后需要向列表中添加其他值,则枚举会失败。假设您需要“也许”以及“是”或“否”。因为它存储在枚举中,所以此更改需要更改数据库。这是一件坏事,有几个原因 - 例如,如果您有一个大型数据集,则重建表可能需要大量时间。
对此的解决方案是使用存储可能值列表的相关表,您的原始字段现在将仅包含对新表的 ID 引用,并且查询将连接到查找表以获取字符串值。这称为“规范化”,被认为是良好的数据库实践。拥有大量此类查找表是一个经典的关系数据库场景。
显然,如果您相当确定该字段将永远不会存储除“是”或“否”之外的任何内容,那么为它准备一个完整的额外表可能是过度的,并且枚举可能是合适的。
一些数据库产品甚至不提供enum
数据类型,因此如果您使用这些数据库,您将被迫使用查找表解决方案(或者只是一个简单的数字字段,并在您的应用程序中映射值)。
在这种情况下,永远不合适的是在表中使用实际的字符串值。这被认为是极差的做法。
VARCHARS 占用的磁盘空间比枚举使用的数值多得多。它们的阅读速度也较慢,在查询中查找的速度也较慢。此外,它们消除了对enum
. 这意味着您的程序中的错误可能会导致无效值进入数据,使用 PHPMyAdmin 或类似工具的无意更新也可能如此。
我希望这会有所帮助。