首页 > 解决方案 > 不同SQL表之间的关系规则

问题描述

我正在研究一个非常灵活的数据库设计案例,但不确定如何正确处理它或这是哪种模式。

这是一个简化版本来说明我遇到的问题:

实体

关系

所以,最后一个关系是这里的问题。由于我们的端点是一个 API,人们可能会发送甲方的guid和与乙方链接的合同 Y的guid 。

那么损害归甲方或乙方所有,这是不可能的。添加损坏时可以添加检查以确保 Party == Contract.Party 但感觉就像我在愚弄关系数据库。

我不确定如何调用此问题以及如何解决它。

标签: c#sqldatabase-designentity-framework-core

解决方案


您可以使用复合键在数据库级别自动实施这种关系。但是,您将无法使用guid。如果您的问题需要使用 guid,那么此解决方案对您没有用处。

下面显示的解决方案适用于任何关系数据库,无需额外代码:

create table party (
  id int primary key not null
);

create table contract (
  party_id int not null,
  contract_no int not null,
  primary key (party_id, contract_no),
  constraint fk1 foreign key (party_id) references party (id)
);

create table damage (
  id primary key not null,
  party_id int not null, -- not nullable
  contract_no int,       -- nullable
  constraint fk2 foreign key (party_id) references party (id),
  constraint fk3 foreign key (party_id, contract_no) 
         references contract (party_id, contract_no)
);

注意: SQL 标准为部分为空的 FK 定义了三个匹配选项(无、部分、完整),但每个数据库都可以自由使用其中任何一个。


推荐阅读