我有很大的DB (数百万行),我试图为两个字段的数据类型做出最好的选择。大多数我做的都是varchar或INT。然而,两个字段,我想知道Enum是否是最好的方式。
字段1第一个字段是性别,我目前的数据要么是“男性”,要么是“女性”,或者可能是空白。我最初是这样设置的:
GENDER VARCHAR(6) NOT NULL这是最好的方法,还是最好将其设置为:
GENDER ENUM ('Male', 'Female') NOT NULL是否需要使其不为空,还是需要添加空白,即
GENDER ENUM ('Male', 'Female', '') NOT NULL更别提了,我正在考虑把整个领域转换成M或F。
字段2:我有很多相同的事情要考虑,除了状态字段,它可能包括52个值(50个状态,DC,加上空白)。
我想最大的问题是-所有这些Enum的东西值得吗?我的DB有数百万行,所以一切都是一个因素,但我是否应该使用VARCHAR(2)作为状态而不是ENUM。
发布于 2011-10-05 21:24:39
我通常适用于这种情况的经验法则是不使用MySQL ENUM。使用它们会产生维护问题,特别是在添加/删除/重命名某些值时。在InnoDB中,重命名和移除枚举值在大表中很重要。添加一个值不是(只要你不把它加在中间)。
由于您可能希望将该列保持在上下文中,并且不允许任何值脱离此上下文,因此IMHO的最佳方法是使用INT,并将其作为外键连接到值表(列id、value)。
您将能够轻松地添加和重命名此表中的值,并且在移除值之前,FK将强制处理主表中具有此值的任何现有记录。
要轻松读取数据,只需一个简单的联接即可。
注意:既然性别是非常最终的,你可能会像VARCHAR(1)那样使用它,或者像Johan建议的那样使用ENUM,但是谁知道呢?将来你可能想支持变性者和雌雄同体。不是开玩笑。
发布于 2011-10-05 21:28:51
如果您想为no value entered有一个值,请使用null --这就是null设计的目的!
如果您想在男性和女性之间指定某些东西(少数不幸的人有这种情况),请使用
ENUM('male','female','neither') NULL;请注意,枚举的作用是而不是在列中存储文字文本值。
male存储为1,female存储为2,neither存储为3等。
这意味着它比varchar高效得多。
如果您在选择中遇到了null,请注意,您可以使用ifnull或coalesce函数来用更有用的东西替换null。
SELECT IFNULL(gender,'unknown') as gender FROM people;
-- or the identical statement
SELECT COALESCE(gender,'unknown') as gender FROM people;https://stackoverflow.com/questions/7667729
复制相似问题