【发布时间】:2011-01-18 12:52:08
【问题描述】:
我在 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)来识别的。
即来自客户的伪语言请求类似于“我是 X 公司,更新我的员工 Y 的数据”。
我需要对 CompanyID 和Employees.ExternalID 的组合强制唯一性,因此在我的数据库中,同一公司的员工不会有重复的ExternalID。
我在考虑 3 种可能的解决方案:
更改员工的架构以包含 CompanyID,并在两个字段上创建唯一约束。
强制执行触发器,该触发器在员工中更新/插入时会验证唯一性。
强制检查应用程序级别(即我的接收服务)。
我的替代 dbadmin-in-me 说 (3) 是最糟糕的解决方案,因为它不能保护数据库的不一致以防应用程序错误或其他问题,而且很可能是最慢的解决方案。
触发器解决方案可能是我想要的,但它可能会变得复杂,特别是如果需要在单个语句中执行多个插入/更新,并且我不确定与 (1) 相比的性能。
而且 (1) 看起来是最快和最简单的方法,但有点违背我对关系模型的理解。
SO DB 专家对每种方法的优缺点有何看法,特别是如果有可能添加额外的间接级别 - 即公司 -> 办公室 -> 部门 -> 员工,并且需要相同的唯一性保留(公司/员工)。
【问题讨论】:
标签: sql mysql database database-design data-modeling