繁体   English   中英

MySQL中ENUM数据类型的替代方法

[英]Alternative to ENUM Datatype in MySQL

我已将ENUM数据类型用于表中的字段,但其值不固定,例如将来可能会更改。 那么要实现的ENUM字段的替代解决方案是什么。

是采用引用表还是使列为varchar或integer?

我认为当您说未来价值可能会改变时,您回答了自己的问题:您必须切换到一种方法,即一次将数据存储在一个中央位置(而不是分散在整个数据库中)。 换句话说,一个主表。

另一个好处是,更改值不需要DDL命令( ALTER TABLE ),而是简单的DML命令( INSERT INTOUPDATE )。 这样甚至可以编写一个简单的管理程序。

例如:

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.

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