MySQL ENUM VS INT

GGi*_*Gio 11 php mysql

我有几个表可以是ENUM类型或INT类型的列.我倾向于总是使用整数类型,假设基于它执行搜索会更快.

例如我的表中的一个具有列:StatusType其可具有仅4个可能的值:Completed,In Progress,Failed,Todo.

而不是将上面存储为ENUM字符串,我将它们存储为:

1,2,3,4分别.然后在我的PHP代码中,我有常量变量来定义这些值,如下所示:

define('COMPLETED', 1);
define('IN_PROGRESS', 2);
define('FAILED', 3);
define('TODO', 4);
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,我是以正确的方式做的还是我应该将其更改为ENUM类型并使用字符串来比较查询?我有许多其他列只能有一组最大4-5可能值.

Gor*_*off 11

这个评论太长了.

在MySQL中,枚举值看起来很酷,但我不是它们的粉丝.它们限制为255个值,因此如果您决定添加更多值,则可能会遇到限制.此外,正如您所描述的,您需要将应用程序代码中的值与数据库中的值同步 - 这似乎是有潜在危险的.

此外,它们使未来的某些变化更加困难.例如,其他数据库不支持枚举.而且,如果您想添加多语言支持,那么在数据库中嵌入数据类型定义的代码有点难以处理.

更标准的方法是一个或多个参考表,您可以使用它们join来获取值.您可以使用混合方法,在数据库中使用引用表.然后,您可以将引用表加载到应用程序中以获取从数字到字符串的映射,这样您就可以避免代码中的连接.


Mik*_*ike 6

你只说对了一半。从性能角度来看,Enum 非常糟糕:MySQL Enum 性能优势?

也就是说,将INTs 的定义绑定到代码也不是一件好事。理想情况下,如果您要遵循正确的数据规范化模式,您也可以在数据库中的另一个表中定义 s 的值INT,并使用定义的索引作为分配的值。

请参阅: http: //en.wikipedia.org/wiki/Database_normalization#Normal_forms

这样做的原因是数据是可移植的,并且不需要代码库来读取它就很有用(您可以通过执行联接轻松转储 Excel 的 CSV)。

神速。

SQL 示例:

SELECT *, state.name AS state FROM students
JOIN states ON student.state_id = states.id
Run Code Online (Sandbox Code Playgroud)

只是为了获得州名。

或者过滤:

SELECT * FROM students
JOIN states ON student.state_id = states.id
WHERE state.name = 'Maine' OR state.code = 'ME'
Run Code Online (Sandbox Code Playgroud)

是的,奇怪的例子,但想法是INTs 很小,并且VARCHAR......可变......存储 'Maine' 而不是 '16' 总计超过数百万行。此外, 上的索引INT比 上的索引快得多VARCHAR,因此您的查找速度也会更快。特别是如果您本来就提前知道该数字并在没有JOIN. 作为一种常见做法,这是不可取的,但如果您想让某些东西更快并且可以确保假设值的有效性,则可以这样做。