我很少看到在野外使用ENUM数据类型;开发人员几乎总是使用一个如下所示的辅助表:

CREATE TABLE officer_ranks (
id int PRIMARY KEY
,title varchar NOT NULL UNIQUE);
INSERT INTO officer_ranks VALUES (1,'2LT'),(2,'1LT'),(3,'CPT'),(4,'MAJ'),(5,'LTC'),(6,'COL'),(7,'BG'),(8,'MG'),(9,'LTG'),(10,'GEN');

CREATE TABLE officers (
solider_name varchar NOT NULL
,rank int NOT NULL REFERENCES officer_ranks(id) ON DELETE RESTRICT
,serial_num varchar PRIMARY KEY);

但同样的事情也可以使用用户定义的类型/枚举来显示:

CREATE TYPE officer_rank AS ENUM ('2LT', '1LT','CPT','MAJ','LTC','COL','BG','MG','LTG','GEN');
    
CREATE TABLE officers (
solider_name varchar NOT NULL
,rank officer_rank NOT NULL
,serial_num varchar PRIMARY KEY);

(示例使用PostgreSQL显示,但其他RDBMS具有类似的语法)

我认为使用枚举的最大缺点是,从应用程序内部进行更新更加困难.而且,这也可能会让一个习惯于将SQL DB简单地当作一个小桶来使用的缺乏经验的开发人员感到困惑.

假设信息大多是静态的(工作日名称、月份名称、美国陆军军衔等),使用枚举有什么优势吗?

推荐答案

使用枚举之类的东西的一个缺点是,如果数据表中碰巧不存在所有可用值,则无法获得所有可用值的列表,除非在某个地方对可用值列表进行硬编码.例如,如果在你的军官表中,你碰巧没有一个MG在岗,那么就无法知道该军衔是否存在.因此,当BG Blowhard被MG Marjorie Banks解职时,你将无法进入新军官的军衔——这是一种耻辱,因为他正是现代少将的典范.:-)当一名陆军将领(五星上将)出现时会发生什么?

对于不会改变的简单类型,我已经成功地使用了域.例如,在我的一个数据库中,我有一个yes_no_域,定义如下:

CREATE DOMAIN yes_no_dom
  AS character(1)
  DEFAULT 'N'::bpchar
  NOT NULL
   CONSTRAINT yes_no_dom_check
     CHECK ((VALUE = ANY (ARRAY['Y'::bpchar, 'N'::bpchar])));

分享和享受.

Postgresql相关问答推荐

Postgr不列出运算符和函数

使函数内部动态插入更具可读性

连接到 PostgreSQL 时没有属性执行错误

@符号在yacc中的函数中是什么意思

如何防止 PDO 将问号解释为占位符?

从 Postgres 字段中的多个值中进行 Select

Rails 迁移:PostgreSQL 上的 Bigint 似乎失败了?

PostgreSQL ORDER BY 问题 - 自然排序

postgreSQL 将列数据类型更改为没有时区的时间戳

'active' 标志与否?

在 postgreSQL 中更改序列名称

适配器 Ecto.Adapters.Postgres 未编译

NOT LIKE 带有 NULL 值的行为

PostgreSQL:将结果数据从 SQL 查询导出到 Excel/CSV

PostgreSQL 表变量

按任意时间间隔计算行数的最佳方法

将数据推送到 Heroku 时出错:time zone displacement out of range

在 postgres 中存在不同的 string_agg 问题

ruby on rails jsonb 列默认值

在子类的 Hibernate 中 for each 表指定不同的序列