我很难弄清楚在创建数据库结构时是否有办法在SQL中强制执行隐式关系。在抽象层面上,我想建模如下:
人可以属于一个或多个工作区,工作区可以有一个或多个子工作区&一个人也可以属于的人。如果一个人属于一个或多个子工作区,那么他也必须属于他们的父工作领域。
有没有办法在SQL中强制执行此关系,还是需要在应用程序层中执行此操作?
答案 0 :(得分:2)
您可以在数据库中强制执行此操作。一种方法是有四个表:Person
,Workfield
,Subworkfield
和PersonWorks
。
前三个是不言自明的。 Subworkfield
表将具有与WorkfieldId
具有外键关系的列Workfield
。列Subworkfield.SubworkfieldId
将是主键,列对SubworkfieldId, WorkfieldId
将被声明为unique
。后一个声明是多余的,但它有助于强制执行其中一个条件。
Personworks
表将有三个(相关)列:
每个人都会有建议的外国参考。如果引用仅为Workfield
,则SubworkfieldId
将为NULL
。
此外,还会有更多的外键引用:
foreign key (WorkfieldId, SubworkfieldId) referenes SubworkfieldId(WorkfieldId, SubWorkfieldId)
而且,为了完整起见,您可以添加:
check (WorkfieldId is not null)
此结构利用了如何为外键引用处理NULL
值。如果密钥或复合密钥的任何部分是NULL
,则不检查外键引用。因此,您可以引用Subworkfield
表,并且仅在填充数据时使用。