繁体   English   中英

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

[英]Mysql Datatype - Enum or not to Enum, Can Enum be blank?

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

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

GENDER VARCHAR(6) NOT NULL

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

GENDER ENUM ('Male', 'Female') NOT NULL

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

GENDER ENUM ('Male', 'Female', '') NOT NULL

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

字段2:除了状态字段之外,我还有很多相同的事情需要考虑,其中包括52个值(50个状态,DC,加上空白)。

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

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

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

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

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

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

如果你想要一个no value entered值的no value entered ,请使用null ,这就是为null设计的!

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

ENUM('male','female','neither') NULL;

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

如果您在选择中遇到null ,请注意您可以使用ifnullcoalesce函数将null替换为更有用的null

SELECT IFNULL(gender,'unknown') as gender FROM people;
-- or the identical statement
SELECT COALESCE(gender,'unknown') as gender FROM people;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM