- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在两个复合 FK 约束的表部分中有一列可以吗?
假设我们有多个业务分支机构,并且我们有两个不同的实体,每个实体都属于一个特定的分支机构。
现在我们想要关联这两个实体(多对多),但只有当它们属于同一分支时才允许关联。
所以我们会有三个表:
在我看来,我有几个选择:
1) 对所有 PK 使用代理键
entitya_id
(pk), branch_id
(fk), 其他列)entityb_id
(pk), branch_id
(fk), 其他列)entities_id
(pk), entitya_id
(fk), entityb_id
(fk))这个问题是我需要在触发器中使用 SELECT
语句来进行验证。我宁愿不那样做。此外,SELECT
语句变得更加复杂,因为它通常需要 JOIN
来访问某些信息。
2)使用自然复合键
entitya_id
,branch_id
)entityb_id
,branch_id
)entitya_id
、entitya_branch_id
、entityb_id
、entityb_branch_id
)这也需要在触发器中进行验证,但至少我只需要对 NEW
值进行简单的 IF
比较。另一方面,键/列的数量快速增长,即使在简单的情况下,表也可能具有巨大的复合键和大量冗余数据。
3) 也使用自然组合键,但只有一个列引用两个表
这是我的第一选择,但我认为不允许在多个表中有一个列引用键。虽然您不能仅使用一列来做到这一点,但显然允许该列成为多个复合约束的一部分,这已被证明 here
entitya_id
,branch_id
)entityb_id
,branch_id
)entitya_id
、entityb_id
、branch_id
)FK 定义如下:
CONSTRAINT `entities_entitya`
FOREIGN KEY (`entitya_id`, `branch_id`)
REFERENCES `entitya` (`entitya_id`, `branch_id`)
ON DELETE CASCADE
ON UPDATE RESTRICT,
CONSTRAINT `entities_entityb`
FOREIGN KEY (`entityb_id`, `branch_id`)
REFERENCES `entityb` (`entityb_id`, `branch_id`)
ON DELETE CASCADE
ON UPDATE RESTRICT
所以 branch_id
变成了某种共享 FK
所以重复我的问题:
最佳答案
您的解决方案 #3 没有任何问题,我认为这是满足您的验证要求的聪明解决方案。它准确地模拟了现实世界的需求——两个实体必须属于同一个分支。
我看不出它会如何导致任何问题,除非假设需求会在以后发生变化。例如,您可能会得到一个稍微不同的要求,即两个分支可以不同,只要它们以某种方式相互关联即可。
在那种情况下,您需要两个不同的列,但是您还需要在两个不同的外键约束中使用每个分支列:
CREATE TABLE Entities (
entitya_id INT,
entitya_branch_id INT,
entityb_id INT,
entityb_branch_id INT,
FOREIGN KEY (entitya_id, entitya_branch_id)
REFERENCES entitya(entitya_id, branch_id),
FOREIGN KEY (entityb_id, entityb_branch_id)
REFERENCES entitya(entityb_id, branch_id),
FOREIGN KEY (entitya_branch_id, entityb_branch_id)
REFERENCES EntityAffiliations(entitya_branch_id, entityb_branch_id)
)
关于mysql - 一列作为多个复合 FK 约束的一部分是否有效且良好的设计决策?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54496852/
假设我有两张 table ,a和 b : a { pk as int fk as int ... } b { pk as int ... } 我想在查询中加入 a 和 b,如下所示: FRO
我在 MYSQL 数据库的各个表中分配的列数比实际需要的长度要长。所以现在我尝试使它们具有适当的长度。它们是 VARCHAR(64),我想让它们变成 CHAR(36)。这些列涉及外键。这些更改将成为一
这是我的 table : 成员:ID,... 产品:ID,... 我的 Member 表有一些值,如果 Id = 0,则没有,并且我不想添加任何 Id = 0 的成员,所以我尝试运行此脚本: ALTE
这个问题已经有答案了: MySQL Relationships (1 个回答) 已关闭 4 年前。 这个问题可能在其他帖子中得到了回答,但我一直在搜索,但没有找到类似的东西(很有趣): 我使用 Lar
两个表,使用这些脚本创建: create table user_auth ( username varchar(255) NOT NULL, password varchar(255)
如果我添加带有 ON DELETE CASCADE 之类的 FK,我以后会遭受后果吗? 如果不是,我应该为 CakePHP 的 MySQL 中的 FK 使用什么命名约定? 最佳答案 您可以看到布局的命
我有一个类似的问题: How to create foreign key that is also a primary key in MySQL? 但是我的架构似乎与答案匹配,但仍然返回错误“ERRO
我有 2 个实体:PurchaseRequest (PR) 和 PurchasingRequestLineItem (PRLI)。他们遵循典型的关系模式,即 PR 有许多 PRLI。我在 PRLI 上
在尝试通过删除连接(非规范化)来优化物理数据模型时,我选择采用用户可能为 CommEventPurposeType 指定的所有可能值,将它们实现为 中的 BOOLEAN 属性>CommEventPur
我猜这些问题似乎很令人困惑。 库存实体 @Entity @IdClass(InventoryPK.class) public class Inventory { @Id @ManyTo
UNIQUE(col1, col2) 与 FK(col1), FK(col2) 我目前启用了两个索引,并且我不太关心外部关系本身。所以我想知道通过拥有所有这些键,我是否会获得冗余索引以提高读取性能,或
我需要将名为“practice”的列插入到表“cred_insurances”中,该表是一个 FK 引用表“practices” PK “id” 最佳答案 您需要通过在 mysql 提示符下运行以下命
使用 JPA 注释和 hibernate ,我们最近遇到了一个单向单多映射问题,如下所示: @Entity public class FooOrder extends AbstractEntity{
我经常听说在编写测试时不要使用随机数据,这对于大多数数据来说似乎是合理的。 但是,我认为我有可能需要这样做的情况。我正在处理的代码有一些非 AR 模型。例如,用户模型不受数据库表支持,因为我们通过 A
我的情况(简化)如下所示: 表 UNITS 在 UNITS.NAME 上有一个 PK。 (单位名称, varchar(12)) 表 DEPTS 在 DEPTS.NAME 上有一个 PK。 (部门名称,
我已经使用现有数据库的代码优先方法创建了一个 MVC 应用程序。 我注意到我的一个表不需要外键,所以我尝试删除它但我不断收到: The object 'FK_BorrowedProperty_code
为什么我的初始 update-database 失败了,我需要在我的数据库表类中更改什么才能使其正常工作? 当然,我可以将迁移脚本中的onDelete: ReferentialAction.Casca
我的主要目标是获取所有数据的最后更新时间。 详细信息:我有一张 table - 群组 groupId groupName timeUpdated (timestamp - on update) 还有另
作为练习,我正在构建我的第一个 SQL 数据库。我试图为数据库中的所有表创建语句。我想知道是否可以删除任何外键? 我的第二个问题是如何对使用 4 个或更多表的联接的数据库进行查询。 任何答案都将受到赞
我正在尝试在我的 H2 数据库中运行此 mysql 命令。 DB设置为mysql模式。 -- -----------------------------------------------------
我是一名优秀的程序员,十分优秀!