如何在多个表之间强制执行唯一性

2024-03-12

我在 MySQL 服务器中有以下表:

Companies:
- UID (unique)
- NAME
- other relevant data

Offices:
- UID (unique)
- CompanyID
- ExternalID
- other data

Employees:
- UID (unique)
- OfficeID
- ExternalID
- other data

其中每个 UID 都是由数据库创建的唯一标识符。

有外键来确保 UID 上的 Employee -> Office -> Company 之间的链接。

办公室和员工中的ExternalID字段是公司(实际上是我的客户)提供给我的应用程序的ID。客户没有(也不关心)我自己的 ID,并且我的应用程序从他们那里收到的所有数据都仅根据他们的 ID(即我表中的ExternalID)进行识别。

IE。来自客户的伪语言请求类似于“我是 X 公司,更新我的员工 Y 的数据”。

我需要强制 CompanyID 和Employees.ExternalID 组合的唯一性,因此在我的数据库中,同一公司的员工不会有重复的ExternalID。

我考虑了 3 种可能的解决方案:

  1. 更改员工的架构以包含公司 ID,并在两个字段上创建唯一约束。

  2. 强制执行触发器,该触发器在更新/插入员工时验证唯一性。

  3. 对应用程序级别(即我的接收服务)执行检查。

我的替代方案-dbadmin-in-me 说(3)是最差的解决方案,因为它不能保护数据库在应用程序错误或其他情况下的不一致,而且很可能是最慢的解决方案。

触发器解决方案可能是我想要的,但它可能会变得复杂,特别是如果需要在单个语句中执行多个插入/更新,并且我不确定与(1)相比的性能。

(1) 看起来是最快、最简单的方法,但有点违背我对关系模型的理解。

SO DB 专家的意见是关于每种方法的优缺点,特别是如果有可能添加额外的间接级别 - 即公司 -> 办公室 -> 部门 -> 员工,并且需要保留相同的唯一性(公司员工)。


你是对的 - #1 是最好的选择。
诚然,乍一看我会质疑它(因为走捷径),但了解业务规则以确保员工只与一家公司相关 - 这是有道理的。

此外,我还有一个外键将员工表中的公司 ID 与办公室表中的公司 ID 相关联。否则,您允许员工与没有办公室的公司有关联。除非这是可以接受的...

如果无法在数据模型中演示关系,则触发器是最后的手段,并且从应用程序提供逻辑服务意味着逻辑是集中的 - 没有机会出现不良数据,除非有人放弃约束(这意味着您会遇到更大的问题) )。

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

如何在多个表之间强制执行唯一性 的相关文章

  • MySQL JSON 存储与两个表

    与使用单独的元表相比 使用 JSON 在表中存储数据有什么好处吗 这是原始架构 Users Table UserId Username Etc 5 John Avatar Table Id UserId ImageName ImageTyp
  • 您使用的 ORM 框架的最佳功能是什么[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • mySQL 基于不同表的 SELECT(计数)更新表

    我有一个课程表和一个科目表 CLASS class id class name subject id date time imagine some rows here SUBJECT subject id subject name curr
  • BULK INSERT 中格式附近的语法不正确?

    我试图找出为什么我使用的 BULK INSERT 命令无法识别命令中使用的 FORMAT 和 FIELDQUOTE 选项 BULK INSERT dbo tblM2016 RAW Current Import File FROM x tms
  • SQL Server、ISABOUT、加权项

    我试图弄清楚加权项在 SQL SERVER 的 ISABOUT 查询中是如何工作的 这是我目前所在的位置 每个查询返回以下行 查询 1 权重 1 初始排名 SELECT FROM CONTAINSTABLE documentParts ti
  • 数据包无序。得到:80 预期:0 node.js

    这是我的 非常简单 代码 var connection mysql createConnection infosDB connection connect connection query SELECT FROM action functi
  • 如何使用Python高效地将CSV文件数据插入MYSQL?

    我有一个带有 aprox 的 CSV 输入文件 400 万条记录 插入已运行超过 2 小时 但仍未完成 数据库仍然是空的 关于如何实际插入值的任何建议 使用insert into 并且更快 比如将插入物分成块 我对 python 还很陌生
  • 无循环按键对多维数组求和

    我有这个 Array 0 gt Array f count gt 1 uid gt 105 1 gt Array f count gt 0 uid gt 106 2 gt Array f count gt 2 uid gt 107 3 gt
  • 使用 SQLite 和 Python 从数据库读取:提供的绑定数量不正确

    我使用以下 python 脚本读取数据库 cur execute SELECT FROM pending where user ID 其中 ID 是某人的名字 在本例中为 Jonathan 但是 当我尝试运行此脚本时 我收到错误消息 Tra
  • 澄清创建临时表的连接顺序

    我在 mysql 中有一个大型查询 涉及将多个表连接在一起 它太慢了 所以我做了 解释 发现它正在创建一个临时表 我怀疑它占用了大部分执行时间 我找到了一些相关资料 mysql 文档 http dev mysql com doc refma
  • InnoDB 或 MyISAM - 为什么不两者都使用呢?

    我读过各种关于两者之间哪个更好的主题InnoDB and MyISAM 看来争论的都是使用还是其他 根据表的不同 是否不能同时使用两者 这样做会有什么缺点 据我所知 发动机可以在CREATE TABLE命令 因此 某些经常读取的表可以设置为
  • Firebird数据库模式/数据差异工具

    RedGate http www red gate com为 Microsoft SQL Server 制作一个工具 允许您捕获两个数据库之间的差异 它生成更新数据库模式所需的脚本 同时保留数据 我需要为 Firebird 数据库找到这样的
  • 为什么 Orchard 在执行内容项查询时如此慢?

    假设我想查询所有 Orchard 用户 ID 并且还想包括那些已被删除 也称为软删除 的用户 该数据库包含大约 1000 个用户 Option A 大约需要 2 分钟 Orchard ContentManagement IContentMa
  • MySQL按总和连接表问题

    我在连接表时遇到问题 以下是示例表 表A 30行 ID Name Description 1 Type Unicode Art 2 Header Spreadsheet 3 Auto Align Off 表B 100行 ID Name De
  • 显示多个表的账户余额

    我有以下两个表 其中存储有关贷记和借记记录的信息 couponCr 表包含 voucherType voucherPrefix voucherNo crparty cramount SALES S 1 1 43000 SALES S 2 1
  • Docker-compose v3 不持久保存 postgres 数据库

    在 docker compose v3 容器关闭并重新启动后 我很难保留 postgres 数据 这似乎是一个常见问题 但经过大量搜索后我无法找到有效的解决方案 我的问题与这里类似 如何使用卷将数据保存在 dockerized postgr
  • Mysql 连接到服务器:用户 root@localhost 的访问被拒绝

    edit9 是否有可能我只是缺少文件夹的一些权限 我真的非常非常感谢更多的建议 edit3 由于这篇文章没有得到足够的回复 而且这绝对是至关重要的 我尽快完成这件事 我重建了我的帖子以显示我认为到目前为止我已经扣除的内容 注意 通过许多不同
  • 严格标准:资源 ID#73 用作偏移量,转换为整数

    我使用这个 PHP 函数获取 MySql 结果 function fetcharray query id if query id query id this gt query res if query id this gt q array
  • 单向关系和双向关系的区别

    我想知道这两个词是什么意思 我遇到他们是在教义的文档 http www doctrine project org documentation manual 2 0 en association mapping 但我不明白他们的意思 这与常见
  • MySQL-分割字符串

    我的问题与这篇文章类似 MySQL 中的 反向 GROUP CONCAT https stackoverflow com questions 17308669 reverse group concat in mysql 然而 而不是反转gr

随机推荐

  • 如何更改 .npz 文件中的值?

    我想改变一个值npz file The npz文件包含几个npy的 我想要除了一个以外的所有 run param 保持不变 我想保存原始文件 这是我的工作代码 DATA DIR C Projects Test data ass file n
  • 从 shell 脚本生成交互式 telnet 会话

    我正在尝试编写一个脚本来允许我登录到控制台服务器的 48 个端口 以便我可以快速确定哪些设备连接到每条串行线路 本质上 我希望能够有一个脚本 给定主机 端口列表 远程登录到列表中的第一个设备 并使我处于交互模式 以便我可以登录并确认设备 然
  • MAC M1 安装“sharp”模块时出错

    Running npm run dev gatsby develop 在 MacBook Pro M1 芯片上退出 Error Something went wrong installing the sharp module Running
  • JSON ValueError:期望属性名称:第 1 行第 2 列(字符 1)

    我在使用 json loads 转换为 dict 对象时遇到问题 我无法弄清楚我做错了什么 我运行这个的确切错误是 ValueError Expecting property name line 1 column 2 char 1 这是我的
  • 在 onStopTrackingTouch 中获取进度,而不是在搜索栏中的 onProgressChanged 中获取进度

    我是 Android 开发新手 我用onProgressChanged获取当前进度 因为进度是函数的参数 but 我只想获得进度的最终值当用户释放seekbar不是立即值 提前致谢 The onStopTrackTouch方法定义在OnSe
  • C 中带有函数的 realloc 结构

    我的 C 程序崩溃了 我太新了 无法弄清楚 到目前为止 它非常简单 我想代码足以找出问题所在 我只是想逐行读取文件 一旦内存不足 我会将结构的内存加倍 如果这还不够 我会提供您需要的其他信息 非常感谢您的帮助 因为我已经被困了几个小时了 J
  • 如何在 MySQL 中获得精确的小数值而不进行四舍五入

    我有下面这个 SQL 脚本 select round 72 396 2 我期望的结果是 72 39 我不想四舍五入这个数字 如果我使用select round 72 396 2 我得到的结果是 72 40如何在不使用 Mysql 舍入的情况
  • 通过 putty 连接到 play-with-docker 实例

    我正在尝试通过 putty 连接到 docker 实例https labs play with docker com https labs play with docker com 我试过了 ip172 18 0 21 email prot
  • 从 Play JSON API 获取更好的错误消息

    Play JSON API 生成的错误消息类型示例 scala gt import play api libs json import play api libs json scala gt Json obj k gt Json obj m
  • 在哪里以及如何使用嵌套类? [复制]

    这个问题在这里已经有答案了 我在想 如果一个类只能在另一个类中实例化 那么在该类中嵌套使用它是正确的 我认为这将有助于我们良好的设计 当我查看我的项目时 我几乎从未见过这样的嵌套结构 但是如果我尝试嵌套类 那么这次我的脑海中会出现另一个问题
  • Java检查Checkbox是否被选中

    I use CheckboxGroup cg new CheckboxGroup Checkbox c1 new Checkbox A false cg Checkbox c2 new Checkbox B false cg Checkbo
  • 如何使用 Angularjs 以 PHP 方式提交表单?

    我发现AngularJS 有点阻止了原始表单的提交方式 https stackoverflow com questions 23813413 how to programmatically submit a form with angula
  • 如何在 ui-router 解析器中重定向?

    我正在尝试在 ui router 解析器内部进行重定向 并想知道是否有办法在路由器解析器中重新路由 目前这并不像人们想象的那样有效 resolver auth state if auth isLoggedIn state go noLogg
  • VB 6:一个窗体上可以有多少个控件?

    我知道命名控件的限制是 254 超出这个限制就必须使用控件数组 但看来我们也达到了数组的极限 知道绝对极限是多少吗 没有absolute限制 如果您在表单上放置了足够多的控件 最终将耗尽内存 我制作了一个测试应用程序 将命令按钮加载到控制数
  • 如何使用“cmp”比较两个二进制文件并找到它们不同的所有字节偏移量?

    我希望获得有关 Bash 脚本循环的帮助 该循环将显示两个二进制文件之间的所有差异 仅使用 cmp file1 file2 它只显示我想使用 cmp 的第一个更改 因为它给出了每个更改所在位置的偏移量和行号 但如果您认为有更好的命令 我愿意
  • 在 Angular 2 中解析来自 Hal+JSON 对象的信息

    我有一个 spring data rest 存储库 它生成一个 hal json 对象 我希望我的 Angular 2 前端能够接收和显示该对象 Hal Json 对象 embedded users name Bob links self
  • Cypress:如何等待所有请求完成

    我正在使用 cypress 来测试我们的 Web 应用程序 在某些页面中 有不同的端点请求被执行多次 例如GET A GET B GET A 为了等待所有请求完成并保证页面已完全加载 赛普拉斯的最佳实践是什么 我不想用很多cy wait 命
  • 在另一个进程中处理 WCF 事件

    我有一个不可序列化的对象 我想从单独的进程访问它 我环顾四周 似乎唯一可行的选择是使用 WCF 但我不确定如何执行此操作 因为我是 WCF 新手 如果我创建一个 WCF 服务 如何将 WinForm 挂钩 到 WCF 服务中的各种事件中 例
  • 无法在 ubuntu 18.04.6 LTS 中安装 django-allauth

    我正在尝试在我的项目中添加社交身份验证 但是当我尝试安装时Django allauth https django allauth readthedocs io en latest installation html它给了我错误我已经尝试过这
  • 如何在多个表之间强制执行唯一性

    我在 MySQL 服务器中有以下表 Companies UID unique NAME other relevant data Offices UID unique CompanyID ExternalID other data Emplo