我在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专家的意见是关于每种方法的利弊的,特别是如果有可能添加额外的间接级别(即公司->办公室->部门->员工)并且需要保留相同的唯一性时,尤其如此(公司员工)。
您是对的-#1是最好的选择。
当然,我会一眼就质疑它(因为快捷方式),但是知道确保员工仅与一家公司相关的业务规则-这是有道理的。
另外,我还有一个外键,将雇员表中的公司编号与办公室表中的公司编号相关联。否则,您允许员工与没有办公室的公司建立联系。除非那是可以接受的…
如果无法在数据模型中证明这种关系,则触发器是万不得已的方法,并且从应用程序提供逻辑服务意味着逻辑是集中的-
除非有人放弃约束(这意味着您有更大的问题,否则没有发生坏数据的机会) )。
问题内容: 这个问题已经在这里有了答案 : 2列组合上的sql唯一约束 (3个答案) 6年前关闭。 我不确定我是否正确表达了这个问题,所以我将尝试更长的解释。我有这种桌子: 我想将(a,b)对与(b,a)相同,并禁止插入重复项。如果PostgreSQL有数据类型,我可以这样声明表: 但是事实并非如此,那么最好的方法是什么? 问题答案:
问题内容: 假设我们有这些表: 是否有可能在上创建唯一约束,使得对于最多一个引用中的所有行,其值都为??陈述另一种方法,我可以创建一个唯一约束,以便上述表的连接没有重复项吗?我没有考虑- 我可以找到的每个数据库的语法似乎都与每个约束都限制在一个表上- 但这可能是我缺乏想象力的原因。(当然,去规范化以包含on是一种解决方案。) 问题答案: 您可以尝试以下方法。您必须在Parent中创建一个冗余的UN
问题内容: 以下代码适用于,它是否也返回重复的笛卡尔积,如果是,如何获得唯一的笛卡尔积? 当我传递包含列表的列表时,这似乎也不起作用 问题答案: 要仅获取唯一元素,可以使用这样的set表示法( 注意: 这不能保证顺序) 或根据Paul Draper的评论,我们可以像这样 如果您也想维护订单 要使您的程序可以使用列表列表,只需将函数声明从 至
在Perl中,使用Moo,可以围绕sub实现sub,它将围绕类中的其他方法。 如何在Raku中实现这种行为,最好使用角色?
问题内容: 我有一个表格,其中包含所有新信息。该表用作所有新闻源查询的参考,因此从那里选择事件项,并从正确的表中检索与该事件相对应的信息。 现在,这是我的问题。我在事件表中有,它对应于不同表中事件的ID,例如for ,for 等等。这些ID可能相同,所以暂时我只是使用了一个不同的auto_increment值对于每个这样在500 上以0等开始的表。显然,我不想这样做,因为我还不知道哪个表中的数据最
问题内容: 我们遇到了适用于多线程的方案。 在主线程中,执行一些逻辑操作并更新数据库,在某种程度上,它将调用另一个服务来更新数据库,该服务在另一个线程中运行。 我们希望两个线程共享同一个事务,这意味着任何一个线程中的任何一个操作都将失败,那么另一个线程中的该操作也将被回滚。 但是工作了几天,我发现一些帖子说JTA不支持多线程。当前我们使用Bitronix作为JTA提供者,有没有人知道Bitroni