c# - 不同SQL表之间的关系规则
问题描述
我正在研究一个非常灵活的数据库设计案例,但不确定如何正确处理它或这是哪种模式。
这是一个简化版本来说明我遇到的问题:
实体
- 聚会
- 合同
- 损害
关系
- 合同总是与一方相关联(很简单)
- 损害必须与一方相关联,但可以选择与合同相关联
所以,最后一个关系是这里的问题。由于我们的端点是一个 API,人们可能会发送甲方的guid和与乙方链接的合同 Y的guid 。
那么损害归甲方或乙方所有,这是不可能的。添加损坏时可以添加检查以确保 Party == Contract.Party 但感觉就像我在愚弄关系数据库。
我不确定如何调用此问题以及如何解决它。
解决方案
您可以使用复合键在数据库级别自动实施这种关系。但是,您将无法使用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 定义了三个匹配选项(无、部分、完整),但每个数据库都可以自由使用其中任何一个。
推荐阅读
- html - 编辑wordpress页面后错误的margin-top
- javascript - 使用jquery获取下拉列表的json数据不起作用
- ios - 无法转换“UILabel!”类型的值 快速到预期的参数类型“字符串”
- java - 使用 Java 反射时出现 ClassCastException
- python - cx_Oracle.DatabaseError: ORA-00942: 表或视图不存在
- docker - 与 docker 容器共享主机上可用的 PCIe 虚拟功能
- node.js - 使用 libfaketime 时,setTimeout 在 Mac OS 和 Linux 上的行为不同
- excel-charts - Excel 散点图 x 轴仅显示序号,但不显示为 x 轴选择的真实数据
- javascript - 脚本未在 Django 中的 ajax 加载内容上运行
- c# - 执行多个进程时出现静态数据表问题