我有大型数据库(数百万行),我正在努力为2个字段的数据类型做出最佳选择。我做的大部分都是varchar或INT。但是,我想知道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。
答案 0 :(得分:11)
我经常适用于这种情况的经验法则不是使用MySQL ENUM。使用它们会产生维护问题,尤其是在添加/删除/重命名某些值时。在InnoDB中,重命名和删除枚举值在大表上很重要。不添加值(只要您不在中间添加它)。
由于您可能希望将此列保留在上下文中,并且不允许任何值超出此上下文,因此IMHO最好使用INT,并将其作为外键连接到值表(列id,值)。
您可以轻松地在此表中添加和重命名值,在删除值之前,FK将强制处理主表中具有此值的任何现有记录。
要轻松阅读数据,您只需要一个简单的JOIN即可。
注意:由于性别是最终的,你可能想把它保留为VARCHAR(1)或使用像Johan建议的ENUM,但谁知道呢?您可能希望将来支持跨性别者和双性化。不开玩笑。
答案 1 :(得分:7)
如果您想拥有no value entered
的值,请使用null
null
设计的值ENUM('male','female','neither') NULL;
!
如果你想在男女之间指定一些东西(一些不幸的人有这种情况),请使用
male
请注意,枚举不将文字文本值存储在列中
female
存储为1,neither
为2,null
为3等
这意味着它比varchar更有效。
如果您在选择中遇到ifnull
,请注意您可以使用coalesce
或null
函数将SELECT IFNULL(gender,'unknown') as gender FROM people;
-- or the identical statement
SELECT COALESCE(gender,'unknown') as gender FROM people;
替换为更有用的内容。
{{1}}