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

2024-03-18

我很少看到 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);

但同样的事情也可以使用用户定义的类型/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 有什么优势吗?


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

这是不正确的。它不是 ISO/IEC/ANSI SQL 要求,因此商业数据库不提供它(您应该提供查找表)。城镇的小端实施各种“额外”,但不执行城镇大端的更严格要求或咕噜声。

我们也没有将 ENUM 作为数据类型的一部分,这是荒谬的。

ENUM 的第一个缺点是它是非标准的,因此不可移植。

ENUM 的第二大缺点是数据库是封闭的。可在数据库上使用的数百个报告工具(独立于应用程序)无法找到它们,因此无法预测名称/含义。如果您有一个普通的标准 SQL 查找表,那么这个问题就可以消除。

第三个是,当你改变值时,你必须改变DDL。在普通标准 SQL 数据库中,您只需在查找表中插入/更新/删除一行即可。

最后,您无法轻松获得 ENUM 的内容列表;你可以使用查找表。更重要的是,您有一个向量可以用来执行任何维度事实查询,从而无需从大型事实表和 GROUP BY 中进行选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL:ENUM 与一对多关系的优点? 的相关文章

  • 如何查找 PostgreSQL 数据库的上次更新时间?

    我正在使用一个批量更新的 postgreSQL 数据库 我需要知道数据库 或数据库中的表 上次更新或修改的时间 两者都可以 我看到 postgreSQL 论坛上有人建议使用日志记录并查询日志 这对我不起作用 因为我无法控制客户端代码库 你可
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • 如何在SSRS中的表上创建热图?

    如何在 SSRS 中创建这样的内容 颜色将根据行中的值 承销商 从红色变为绿色 所有这些都在一个组中 您可以通过右键单击各个单元格并根据表达式设置填充颜色来完成此操作 In the Image below I ve mistakingly
  • SQL参数化查询不显示结果

    我的 DataAcess 类中有以下函数 但它没有显示任何结果 我的代码如下 public List
  • 连接两个表的查询的 SQL Server“FOR XML”输出

    我是 SQL Server 中 FOR XML 功能的新手 我正在使用 SQL Server 2012 我有两个表 Word 和 Word Expansion 样本数据 表 字 WordOID Word 1 PIPE 2 WIRE 表 Wo
  • SQLite HAVING 比较错误

    我有一个测试 SQLite 表 用于存储带有值的报告数据 CREATE TABLE IF NOT EXISTS test fact daily revenue date TEXT revenue NUMERIC product TEXT I
  • 使用两个日期之间的随机日期时间更新每一行

    我有一个专栏叫date created我希望每一行保存一个随机日期 日期距当前时间为 2 天 我正在运行以下查询 但它会更新具有相同随机日期的所有行 我希望每一行都是随机的并且不相同 update table set date create
  • 防止 PostgreSQL 中专有名词的词干?

    以其热情将词干标记转化为词位 http www postgresql org docs current interactive textsearch intro html PostgreSQL全文搜索引擎也减少了专有名词 例如 essais
  • 复选框上的数据绑定

    我目前正在将数据从 SQL 数据库之一提取到我的应用程序中 我可以让它适用于我的文本框和其他项目 但是 我似乎无法让它适用于复选框 这是我正在使用的代码 DataTable dt new DataTable dt using SqlConn
  • 为什么这会返回资源 id #2? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • Google Cloud SQL - Postgresql 存储不断增长

    我最近开始修补 Google Cloud SQL PostgreSQL 我创建了一个空数据库 在 4 5 天的时间里 其存储使用量已增长到超过 20GB 它一直在上升 但数据库中没有数据 它甚至没有被使用 有谁知道会发生什么以及如何阻止它
  • 将 UUID 存储为 base64 字符串

    我一直在尝试使用 UUID 作为数据库键 我希望占用尽可能少的字节数 同时仍然保持 UUID 表示形式的可读性 我认为我已经使用 base64 将其减少到 22 个字节 并删除了一些尾随的 这些 对于我的目的来说似乎没有必要存储 这种方法有
  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • 如何在不运行 PostgreSQL 服务器的情况下初始化 PostgreSQL 数据库

    在初始化脚本中 我想初始化 PostgreSQL 目录 但在此阶段不需要 也不希望 正在运行的 PostgreSQL 服务器 如果我只是创建集群 作为用户postgres initdb D 但是 我还需要创建 PostgreSQL 角色 创
  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 了解 SSMS 2008 中关系的更新和删除规则

    当我们定义外键约束时 我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑 我也没有找到相关的帮助文档 例如F1帮助 这是屏幕快照 如果有人能描述它们的含义并推荐一些相关文档来阅读 我将
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教

随机推荐

  • C# 开发最简单的免费设置

    我在上网本上使用 Windows XP SP3 我需要编译 C 程序以供学习 我没有快速的电脑或快速的互联网连接或快钱 有人可以建议让我继续前进的最佳方法吗 谢谢你们 http www microsoft com express Downl
  • 在 Android 3.1 上调整 TextView 大小不会缩小其高度

    我有一个TextView可以动态调整大小 我使用setTextSize 它在 Android 2 2 上正确扩展和收缩其边界 但在Android 3 1上 当文本变小时 区域的高度不会缩小 这证明了这一点 布局只是简单的垂直LinearLa
  • 背景和 CSS 浮动

    所以我使用 960 网格系统 发现了一些他们不支持的东西 我考虑过切换到蓝图 但我必须在此过程中稍后再回到设计 不管怎样 我简化了我的代码来展示我所经历的
  • 对数据库中的项目符号进行排序

    我有一个专栏 datatype varchar 50 在数据库 SQL Server 2008 中 其值如下所示 1 2 1 1 11 4 1 5 2 1 1 1 4 1 2 1 4 2 2 4 3 4 2 4 3 1 4 2 1 11 2
  • HTML 标题对齐问题

    你好 我有 2 个简单的标题 一个 h3 位于一个 h2 之上 由于某些奇怪的原因 h2 标题的左侧似乎有一个 1px 的间隙 这让我发疯 我只是不明白为什么会这样 h2 的字体大小为 40px 而 h3 的字体大小为 12px 有人能帮我
  • 使用 EPPlus 返回 INT 的 Excel 日期列

    所以我使用 EPPlus 来读取和写入 Excel 文档 Workflow 用户生成填充的 Excel 文档 打开文档并添加一行 已上传并已阅读 当我读回值时 使用 EPPlus 创建文档时生成的日期显示正确 但用户更改日期或添加的行显示为
  • 如何在样式文件中定义可绘制对象的大小?

    我想指定一次资源 值 styles xml两个复选框的大小及其四个形状可绘制对象 res drawable cb1 checked xml res drawable cb1 unchecked xml res drawable cb2 ch
  • 是什么原因导致“无可辩驳的模式失败了”,这是什么意思?

    什么是 无可辩驳的模式失败了 意思是 什么情况会导致这个运行时错误 考虑这个例子 foo Just x hello main putStrLn foo Nothing 这使用了一种无可辩驳的模式 部分 无可辩驳的模式总是 匹配 所以这个打印
  • Android TTS 音量控制

    向 TTS 引擎发送请求时 有什么方法可以控制 TTS 引擎的音量吗 我可以在这里使用 AudioManager 吗 谢谢 您可以在 TTS talk 方法中获取此信息 但只能从 API 级别 11 开始 为了保持向后兼容性 您可以定位更高
  • Java 通用列表>

    为什么在java中我们不能这样做 List
  • 使用 PHP 连接到 CMU Sphinx

    我一直在研究语音识别以及将其实施到网站中的方法 我发现了许多将其与 Python 一起使用的示例 甚至还有一个与 Node js 一起使用的示例 但我希望能够将 PHP 与此一起使用 有什么方法可以使用 PHP 访问 Linux 服务器上的
  • 如何在 Google Workspace 插件中国际化 universalActions 标签

    我设置了一个 Gmail 插件universalActions菜单 标签应由以下方式定义Session getActiveUserLocale 以任何方式 由于清单文件中不允许使用变量 appscript json 我不知道该怎么做 我正在
  • 无法在 VS 2017 15.5.7 中添加服务引用

    我有一个 VB NET Core 应用程序 我正在尝试连接到远程 WCF 服务 当我尝试通过 添加连接服务 常规情况下 未列出任何服务 并显示一条消息 当前项目类型不支持任何连接服务 我尝试安装 WCF Web 服务参考提供程序扩展 IIU
  • 如何在android中通过特定应用程序分别查找wifi和网络数据使用情况?

    recived TrafficStats getUidRxBytes uid send TrafficStats getUidTxBytes uid TrafficStats getMobileRxBytes TrafficStats ge
  • Leaflet maxBounds - 边界不起作用

    我尝试了 Leafletjs maxBounds我在 Mapbox 找到的示例代码 https www mapbox com mapbox js example v1 0 0 maxbounds 下面你可以找到我的完整代码 也在jsfidd
  • 有什么理由使用运行时断言而不是编译时断言?

    在审查 Visual C 代码库时 我发现了以下奇怪的事情 运行时断言 即检查条件 如果违反条件则抛出异常 用于可以在编译时评估条件的情况 assert sizeof SomeType sizeof SomeOtherType 显然 编译器
  • 错误 [ExceptionHandler] 无法读取 NestJs 中未定义的属性“__guards__”

    我正在努力在 Nest 项目中实现简单的身份验证 当我添加 UseGuards AuthGuard local 我的控制器出现以下错误 ERROR ExceptionHandler Cannot read property guards o
  • 模拟空格键按键

    我到处搜索 阅读MDN上的文档 但我似乎无法解决这个问题 I want to emulate the client pressing the space bar using JavaScript 我试过了 var e new Keyboar
  • 如何使用 JSDoc Typescript 声明隐藏“私有”方法?

    假设我有一个 JavaScript 类 element my element export class MyElement extends HTMLElement publicMethod private privateMethod cus
  • SQL:ENUM 与一对多关系的优点?

    我很少看到 ENUM 数据类型在野外使用 开发人员几乎总是只使用如下所示的辅助表 CREATE TABLE officer ranks id int PRIMARY KEY title varchar NOT NULL UNIQUE INS