Vic*_*tor 5 mysql database-design enum
假设我们有订单表,并且订单有状态。这三个选项中哪一个最好?
varchar
状态栏enum
状态栏status_id int
和name varchar
,并且在订单表中保留status_id
作为外键。哪种方法是最好的?int
我怀疑使用字典表也更好,因为通过, 而不是 来搜索状态会更快varchar
。
嗯,我是 ENUM 的拥护者——至少在有限的使用中是这样。
status
我会将它与一个小的、相当静态的可能值列表一起使用。我会从unknown
发现拼写错误开始。 长期以来一直在优化以在列表末尾ALTER TABLE
添加新选项。ENUM
我不会用于ENUM
大陆。如果有标准缩写,我会使用缩写VARCHAR
。对于国家来说,我主张
country CHAR(2) CHARACTER SET ascii
Run Code Online (Sandbox Code Playgroud)
使用查找表可能会降低效率。数据仓库中的“星型”模式效率可能非常低。JOINs
当需要多个时会发生这种情况;ENUM
避免了低效率。 VARCHAR
体积庞大,这在DW应用中是一个大问题。
在许多情况下, An 的ENUM
作用类似于字符串: WHERE status = 'OK'
比任何一种替代方案都更具可读性。
比较两个整数与两个字符串:整数的速度还不够快,因此并不重要。
VARCHAR
-- 当体积不成问题时使用ENUM
-- 当体积庞大成为问题并且选择数量相当小且稳定时使用。