不同SQL表之间的关系规则

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不同SQL表之间的关系规则相关的知识,希望对你有一定的参考价值。

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

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

实体

  • 聚会
  • 合同
  • 伤害

关系

  • 合同总是链接到一方(非常容易)
  • 损害必须与当事方有关,但可以选择与合同有关

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

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

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

答案

您可以在表上使用约束来强制执行此行为,因此数据库将强制执行数据完整性,并且不能插入无效值。例如,使用SQL Server,我们可以为this answer创建类似的解决方案。

CREATE FUNCTION dbo.IdMismatches()
RETURNS int
AS BEGIN RETURN (
    SELECT COUNT(*)
    FROM Damage d
    JOIN Contract c ON d.ContractId = c.Id
    WHERE d.PartyId != c.PartyId
) END
go
ALTER TABLE Shift ADD CONSTRAINT chkMismatches CHECK (dbo.IdMismatches() = 0);

我不知道您是否正在寻找这种“数据库设计”,但是我认为无法避免使用此类检查的方法。这样,至少SQL Server可以强制执行此约束。

[我还建议您仍然使用所提到的方法在服务器上检查此属性-在服务器端验证用户输入或检查商业智能属性没有问题。

以上是关于不同SQL表之间的关系规则的主要内容,如果未能解决你的问题,请参考以下文章

SQL中的外部键约束有啥用?

SQL:使用 2 个不同的 auto_increment 创建关系表

sql怎么设置外键

sql怎么设置外键

两个表之间的许多关系 - 代码优先

SQL多表联合查询