2014-10-04 53 views
0

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

一个可以属于一个或多个Workfield的,一个workfield可以有一个或多个子workfield的其中一个人也可以属于。如果一个人属于一个或多个子工作田,那么他也必须属于他们的父母工地。

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

回答

2

您可以在数据库中执行此操作。一种方法是有四个表格:Person,Workfield,SubworkfieldPersonWorks

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

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

  • PERSONID引用人(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表,并且仅在数据填充时使用。

+0

谢谢,明确的食物! – 2014-10-04 16:29:46