首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Enum是否为Enum,Enum是否为空?

Enum是否为Enum,Enum是否为空?
EN

Stack Overflow用户
提问于 2011-10-05 21:05:33
回答 2查看 9.9K关注 0票数 12

我有很大的DB (数百万行),我试图为两个字段的数据类型做出最好的选择。大多数我做的都是varchar或INT。然而,两个字段,我想知道Enum是否是最好的方式。

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

代码语言:javascript
复制
GENDER VARCHAR(6) NOT NULL

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

代码语言:javascript
复制
GENDER ENUM ('Male', 'Female') NOT NULL

是否需要使其不为空,还是需要添加空白,即

代码语言:javascript
复制
GENDER ENUM ('Male', 'Female', '') NOT NULL

更别提了,我正在考虑把整个领域转换成M或F。

字段2:我有很多相同的事情要考虑,除了状态字段,它可能包括52个值(50个状态,DC,加上空白)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-05 21:24:39

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

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

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

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

注意:既然性别是非常最终的,你可能会像VARCHAR(1)那样使用它,或者像Johan建议的那样使用ENUM,但是谁知道呢?将来你可能想支持变性者和雌雄同体。不是开玩笑。

票数 11
EN

Stack Overflow用户

发布于 2011-10-05 21:28:51

如果您想为no value entered有一个值,请使用null --这就是null设计的目的!

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

代码语言:javascript
复制
ENUM('male','female','neither') NULL;

请注意,枚举的作用是而不是在列中存储文字文本值。

male存储为1,female存储为2,neither存储为3等。

这意味着它比varchar高效得多。

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

代码语言:javascript
复制
SELECT IFNULL(gender,'unknown') as gender FROM people;
-- or the identical statement
SELECT COALESCE(gender,'unknown') as gender FROM people;
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7667729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档