我在 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 种可能的解决方案:
更改员工的架构以包含公司 ID,并在两个字段上创建唯一约束。
强制执行触发器,该触发器在更新/插入员工时验证唯一性。
对应用程序级别(即我的接收服务)执行检查。
我的替代方案-dbadmin-in-me 说(3)是最差的解决方案,因为它不能保护数据库在应用程序错误或其他情况下的不一致,而且很可能是最慢的解决方案。
触发器解决方案可能是我想要的,但它可能会变得复杂,特别是如果需要在单个语句中执行多个插入/更新,并且我不确定与(1)相比的性能。
(1) 看起来是最快、最简单的方法,但有点违背我对关系模型的理解。
SO DB 专家的意见是关于每种方法的优缺点,特别是如果有可能添加额外的间接级别 - 即公司 -> 办公室 -> 部门 -> 员工,并且需要保留相同的唯一性(公司员工)。
你是对的 - #1 是最好的选择。
诚然,乍一看我会质疑它(因为走捷径),但了解业务规则以确保员工只与一家公司相关 - 这是有道理的。
此外,我还有一个外键将员工表中的公司 ID 与办公室表中的公司 ID 相关联。否则,您允许员工与没有办公室的公司有关联。除非这是可以接受的...
如果无法在数据模型中演示关系,则触发器是最后的手段,并且从应用程序提供逻辑服务意味着逻辑是集中的 - 没有机会出现不良数据,除非有人放弃约束(这意味着您会遇到更大的问题) )。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)