当前位置: 首页 > 面试题库 >

SQL:ENUM与一对多关系的优势?

赏育
2023-03-14
问题内容

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

CREATE TABLE officer_ranks (
id int PRIMARY KEY
,title varchar NOT NULL UNIQUE);
INSERT INTO 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);

但是,使用用户定义的类型/ ENUM也可以显示相同的内容:

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具有类似的语法)

我看到使用ENUM的最大缺点是,从应用程序内部进行更新更加困难。这也可能会使一个经验不足的开发人员感到困惑,他们曾经只是简单地将SQL DB用作存储桶。

假设信息大部分是静态的(工作日名称,月份名称,美国陆军军衔等),使用ENUM有什么好处吗?


问题答案:

使用ENUM之类的缺点是,如果数据表中不存在所有可用值,则无法获得所有可用值的列表,除非您将可用值列表硬编码在某处。例如,如果在OFFICERS表中您没有碰巧出现过MG,则无法知道排名是否存在。因此,当MG
Marjorie-Banks解除BG Blowhard的职务时,您将无法进入新军官的职位-
这真是可惜,因为他是现代少将的楷模。:-)当陆军将军(五星级将军)出现时,会发生什么?

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

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])));

分享并享受。



 类似资料:
  • 问题内容: 我有一个使用联接表建模的一对多关系: 这些表应该模拟一个t1与多个t2的关系。使用JPA为这些表建模的正确方法是什么? 问题答案: 一个T1到多个T2的典型表是在T2上有一个指向T1的外键。通常不需要T1_T2表。 这样,JPA结构将是一对多的,可能是双向的。 可能会有一些安排,以使您描述的结构起作用。您可以更改T1_T2: 在T2上添加唯一约束(以便仅允许一个T2) 那真的是你想要的

  • 是否可以与用户建立多对多关系?我试图制作一个简单的实体 但是当我从列表中选择用户并选择Save时,它给出了错误 org.springframework.dao.InvalidDataAccessApiUsageExc的:org.hibernate.瞬态对象异常:对象引用未保存的瞬态实例-保存瞬态实例前冲洗:com.mycompany.myapp.domain.用户;嵌套异常java.lang.Il

  • 问题内容: 我想创建一个与用户类对象之间的多对多关系。 我有这样的事情: 问题是我是否可以在内部使用类引用。还是我必须使用欧洲工商管理学院的?还是有另一种(更好的)方法呢? 问题答案:

  • 这是项目迁移 这是时间表 这样用户就可以迁移了 这是我的项目模型 这是我的时间表模型: 这是我的用户模型 现在,我从项目返回我的查询 这是可以的,但user_id用户在timesheets.user_id我不能得到它的时间表,并得到它 此控制器按时间表中的项目id返回项目和时间表,但时间表中的用户id我不知道如何将其输入系统

  • 在数据库表之间,绝大多数的关系很可能是一对多的关系,一个表中的记录有可能与另一个表中的许多记录相关。 创建一对多关系的过程与创建一对一关系完全相同。 让我们先通过单击设计 选项卡上清除布局 选项清除布局。 再添加另一个表,如以下屏幕截图所示。 点击保存图标并输入作为表名,然后转到关系视图。 点击显示表选项,然后选择两个表: 和 。如下所示 - 添加和并关闭显示表格对话框。 我们再次执行相同的操作过