【发布时间】:2018-08-17 17:55:17
【问题描述】:
假设,我需要创建一个表,其中一列将具有来自这个有限且永不更改的集合的值: 'all'、'local'、'qa'、'staging' 和 'production'。
在这种情况下使用enum 数据类型看起来是一个合适的解决方案,但是在阅读了this article 和互联网上的其他一些帖子之后,我觉得不鼓励使用它。所以,如果我不想要创建一个查找表并且保持evn和name的组合唯一也是一个要求,那么我最好的选择是什么具有 ENUM 类型的列和具有 VARCHAR 类型但在其上创建了索引的列。
同时考虑到此表中的插入很少见,我们希望此特定查询执行得更快:
SELECT `enabled` FROM `features`
WHERE `name` = 'some_featuere'
AND `env` IN('all', 'qa')
ORDER BY `enabled` ASC limit 1;
其中哪一个是更好的设计,为什么?
CREATE TABLE `features` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`name` VARCHAR (50) NOT NULL,
`env` ENUM('all', 'local', 'qa', 'staging', 'production') NOT NULL,
`enabled` TINYINT(1) DEFAULT 0,
`created_at` DATETIME,
`updated_at` DATETIME,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_unq_features_name_env` (`name`,`env`)
);
或
CREATE TABLE `features` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`name` VARCHAR (50) NOT NULL,
`env` VARCHAR(10) NOT NULL,
`enabled` TINYINT(1) DEFAULT 0,
`created_at` DATETIME,
`updated_at` DATETIME,
PRIMARY KEY (`id`),
INDEX `idx_features_env` (`env`),
UNIQUE KEY `idx_unq_features_name_env` (`name`,`env`)
);
【问题讨论】:
-
您不想要查找表,这很糟糕。使用整数。你有 5 个选项。不要过度设计这个。使用查找表,不要重新发明轮子。
标签: mysql database indexing database-design sqldatatypes