在SQL中实现隐式关系

时间:2014-10-04 16:04:48

标签: sql

我很难弄清楚在创建数据库结构时是否有办法在SQL中强制执行隐式关系。在抽象层面上,我想建模如下:

可以属于一个或多个工作区,工作区可以有一个或多个子工作区&一个人也可以属于的人。如果一个人属于一个或多个子工作区,那么他也必须属于他们的父工作领域。

有没有办法在SQL中强制执行此关系,还是需要在应用程序层中执行此操作?

1 个答案:

答案 0 :(得分:2)

您可以在数据库中强制执行此操作。一种方法是有四个表:PersonWorkfieldSubworkfieldPersonWorks

前三个是不言自明的。 Subworkfield表将具有与WorkfieldId具有外键关系的列Workfield。列Subworkfield.SubworkfieldId将是主键,列对SubworkfieldId, WorkfieldId将被声明为unique。后一个声明是多余的,但它有助于强制执行其中一个条件。

Personworks表将有三个(相关)列:

  • PersonId引用Person(PersonId)
  • WorkfieldId引用Workfield(WorkfieldId)
  • SubworkfieldId引用Subworkfield(SubworkfieldId)

每个人都会有建议的外国参考。如果引用仅为Workfield,则SubworkfieldId将为NULL

此外,还会有更多的外键引用:

foreign key (WorkfieldId, SubworkfieldId) referenes SubworkfieldId(WorkfieldId, SubWorkfieldId)

而且,为了完整起见,您可以添加:

check (WorkfieldId is not null)

此结构利用了如何为外键引用处理NULL值。如果密钥或复合密钥的任何部分是NULL,则不检查外键引用。因此,您可以引用Subworkfield表,并且仅在填充数据时使用。