我很少看到在野外使用ENUM数据类型;开发人员几乎总是使用如下所示的辅助表:
创建表格官员等级(
id int主键
,title varchar非空(唯一);
在军官军衔中插入值(1,'2LT')、(2,'1LT')、(3,'CPT')、(4,'MAJ')、(5,'LTC')、(6,'COL')、(7,'BG')、(8,'MG')、(9,'LTG')、(10,'GEN');
创建表格管理员(
士兵名称varchar不为空
,rank int NOT NULL引用删除限制上的军官等级(id)
,serial_num varchar主键);
但也可以使用用户定义的类型/枚举来显示相同的内容:
创建类型官员,其级别为ENUM('2LT','1LT','CPT','MAJ','LTC','COL','BG','MG','LTG','GEN');
创建表格管理员(
士兵名称varchar不为空
,职级官员(职级不为空)
,serial_num varchar主键);
(示例使用PostgreSQL显示,但其他RDBMS具有类似的语法)
我看到使用枚举的最大缺点是,从应用程序内部进行更新更加困难。而且,这也可能会让一个习惯于将SQL DB简单地当作一个小桶来使用的没有经验的开发人员感到困惑
假设信息大部分是静态的(工作日名称、月份名称、美国陆军军衔等),使用枚举有什么优势吗
使用PostgreSQL显示的示例,但其他RDBMS具有类似的语法
那是不对的。它不是ISO/IEC/ANSI SQL要求,因此商业数据库不提供它(您应该提供查找表)。小城镇实施了各种“额外措施”,但没有实施更严格的要求,或大城镇的呼噜声
我们也没有将枚举作为数据类型的一部分,这是荒谬的
枚举的第一个缺点是它是非标准的,因此不可移植
Enum的第二大缺点是,数据库是关闭的。可以在一个数据库(独立于应用程序)上使用的数百个报告工具无法找到它们,因此无法预测名称/含义。如果您有一个普通的标准SQL查找表,那么这个问题就消除了
第三,当您更改值时,必须更改DDL。在普通的标准SQL数据库中,只需在查找表中插入/更新/删除一行即可
最后,您无法轻松获得枚举内容的列表;您可以使用查找表。更重要的是,您可以使用一个向量执行任何维度事实查询,从而无需从大型事实表和分组依据中进行选择