|
我很少在野外看到它。ENUM数据类型。开发人员几乎总是使用以下辅助表:$ s+ p/ a6 A4 J% l
CREATE TABLE officer_ranks (id int PRIMARY KEY,title varchar NOT NULL UNIQUE);INSERT INTO ranks VALUES (1,'2LT(2,'1LT(3),CPT(四,MAJLTC(六,COL'),(7,'BG(MG(9,LTGGEN');CREATE TABLE officers (solider_name varchar NOT NULL,rank int NOT NULL REFERENCES officer_ranks(id) ON DELETE RESTRICT,serial_num varchar PRIMARY KEY);然而,用户定义的类型/ ENUM同样的内容也可以显示:
. b# Z% r7 H$ ACREATE 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语法相似)+ j- ~: }' ?9 \# z2 n7 P* e
我看到使用ENUM的最大缺点是,从应用程序内部进行更新更加困难。这也可能会使一个经验不足的开发人员感到困惑,他们曾经只是简单地将SQL DB用作储物桶。9 a# O! \2 {5 p- V. }
假设大部分信息是静态的(工作日、月、美国军衔等)。),使用ENUM有什么好处吗?
s& D! |$ f" F- y2 S Z* c
# \ ]/ O& Z' f/ C9 i9 k 解决方案: * K0 D9 n/ V/ k' O% H; d I- _0 h- O
使用ENUM缺点是,如果数据表中没有所有可用值,除非您在某个地方硬编码可用值列表,否则无法获得所有可用值列表。例如,如果是OFFICERS你没有碰巧出现在表中MG,不知道排名是否存在。所以,当MG* B R4 Q% F1 H6 I
Marjorie-Banks解除BG Blowhard你将无法进入新军官的职位-
, q$ b' T, y( w# K) N可惜他是现代少将的楷模。-)陆军将军(五星级将军)出现时会发生什么?
! K3 O7 ~- q! l! ?7 Q, O' P9 p我已经成功地使用了不会改变的简单类型。例如,在我的数据库中,我定义了一个yes_no_domain,如下所示: a# H' n3 g" q; q S- s N- P+ h
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])));分享和享受。 |
|