[英]Alternative to ENUM Datatype in MySQL
我已将ENUM数据类型用于表中的字段,但其值不固定,例如将来可能会更改。 那么要实现的ENUM字段的替代解决方案是什么。
是采用引用表还是使列为varchar或integer?
我认为当您说未来价值可能会改变时,您回答了自己的问题:您必须切换到一种方法,即一次将数据存储在一个中央位置(而不是分散在整个数据库中)。 换句话说,一个主表。
另一个好处是,更改值不需要DDL命令( ALTER TABLE
),而是简单的DML命令( INSERT INTO
, UPDATE
)。 这样甚至可以编写一个简单的管理程序。
例如:
CREATE TABLE car (
car_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
plate VARCHAR(20) NOT NULL,
color ENUM('White', 'Black', 'Red', 'Blue'),
PRIMARY KEY (car_id),
);
...被替换为:
CREATE TABLE car (
car_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
plate VARCHAR(20) NOT NULL,
color_id INT(10),
PRIMARY KEY (car_id),
CONSTRAINT car_fk1 FOREIGN KEY (color_id) REFERENCES color (color_id)
);
CREATE TABLE color (
color_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (color_id),
UNIQUE INDEX name (name)
);
不用说,您可以在具有颜色的任何其他实体中重用颜色定义。
我喜欢使用varchar,然后在代码中声明映射到适当值的常量。 我经常也在该列的注释中列出可能的值及其含义。
使用varchar的效率比使用tinyint的效率低(如Aju John在他的评论中建议的那样),但是除非我要处理的是性能至关重要的表或庞大的表,否则我会发现它更容易处理。 当我从表中手动选择数据以及调试代码时,它使我能够了解实际值(即,无需记住每个数字在使用整数列时的含义),并且在大多数情况下,效率和便利性之间的权衡是非常值得。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.