Mysql数据类型 - Enum或不枚举,Enum是否为空?

Kev*_*vin 12 mysql database database-schema

我有大型数据库(数百万行),我正在尝试为2个字段的数据类型做出最佳选择.我做的大部分都是varchar或INT.然而,2个领域我想知道Enum是否是最好的方式.

字段1 第一个字段是性别,我的数据目前是"男性"或"女性",或者可能是空白.我最初设置如下:

GENDER VARCHAR(6) NOT NULL
Run Code Online (Sandbox Code Playgroud)

这是最好的方式,还是最好将其设置为:

GENDER ENUM ('Male', 'Female') NOT NULL
Run Code Online (Sandbox Code Playgroud)

我是否需要将其设为NOT NULL以允许空白,或者我是否需要添加空白,即

GENDER ENUM ('Male', 'Female', '') NOT NULL
Run Code Online (Sandbox Code Playgroud)

更何况,我正在考虑将整个领域转换为M或F.

第2场: 除了状态字段外,我还有很多相同的事情要考虑,其中可能包含52个值(50个状态,DC,加空白).

我想最大的问题是 - 所有这些Enum的东西都值得吗?我的数据库有数百万行,所以一切都是一个因素,但我应该只使用VARCHAR(2)作为状态而不是ENUM.

Gal*_*alz 11

我经常适用于这种情况的经验法则是不使用MySQL ENUM.使用它们会产生维护问题,尤其是在添加/删除/重命名某些值时.在InnoDB中,重命名和删除枚举值在大表上很重要.不添加值(只要您不在中间添加它).

由于您可能希望将此列保留在上下文中,并且不允许任何值超出此上下文,因此IMHO使用INT的最佳方式是将其作为外键连接到值表(列id,值).

您可以轻松地在此表中添加和重命名值,在删除值之前,FK将强制处理主表中具有此值的任何现有记录.

要轻松读取数据,您只需要一个简单的JOIN即可.

注意:由于性别是最终的,你可能想把它保留为VARCHAR(1)或使用像Johan建议的ENUM,但谁知道呢?您可能希望将来支持跨性别者和双性化.不开玩笑.


Joh*_*ica 7

如果您想拥有一个值no value entered,请使用null它的null设计目标!

如果你想在男性和女性之间指定一些东西(一些不幸的人有这种情况),请使用

ENUM('male','female','neither') NULL;
Run Code Online (Sandbox Code Playgroud)

需要注意的是一个枚举并没有存储在列中的文字文本值.
male存储为1,female为2和neither3等.
这意味着它比varchar更有效.

如果您null在选择中苦苦挣扎,请注意您可以使用ifnullcoalesce函数替换null更有用的东西.

SELECT IFNULL(gender,'unknown') as gender FROM people;
-- or the identical statement
SELECT COALESCE(gender,'unknown') as gender FROM people;
Run Code Online (Sandbox Code Playgroud)