2014-09-10 76 views
2

我正在处理一个小数据库项目,并且对组织此数据模式的复杂约束存在问题。SQL复杂约束

Schema

这里我用BodyPartTag来描述BodyPart类的一个实例接受LayerTags。 问题是如果我打算构建一个BodyPart实体,我没有来自关联的BodyPartTag的直接约束。我可以创建一个名为'Red Eyes'的BodyPart,即BodyPartTag是'Eyes',但即使'Eyes'BodyPartTag只接受'Left Eye','Right Eye'LayerTags,我也可以将其添加到BodyPart的任何图层。

我该如何重组表以添加这些约束?目前我使用'编程'解决方案,但它需要很多编码,这对于这类任务似乎不正确。

详情:白点是ONE,黑点是MANY。

+0

层表的目的是什么? – Ram 2014-09-10 17:02:18

+0

LayerTable描述身体部位的“碎片”。 BodyPart是相关图层的逻辑“聚合”。 – shadeglare 2014-09-10 17:09:24

+0

在这个例子中是'Left Eye'和'Right Eye' Layers or LayerTags? – Ram 2014-09-10 17:20:16

回答

1

你可以用复合键而不是代理键来做到这一点。这并不是一个好的方法,但是如果你使用这样的模式,它将提供一个指定的数据约束。

首先,“标签”项添加到LayerBodyPart表的主键,以便主键现由两个值,即

Layer table: PK_Layer (Id, LayerTagId) 
BodyPart table: PK_BodyPart (Id, BodyPartTagId) 

然后使用这些创建BodyPartLayer表组合键(每个2个值),而不是当前键(单个值)。该BodyPartLayer表变成了4值表的列

-- The two 'bodypart' values have foreign key back to the `BodyPart` table, 
BodyPartId 
BodyPartTagId 

-- and the two 'layer' values have foreign key back to the `Layer` table. 
LayerId  
LayerTagId 

最后,创建从BodyPartLayer表的外键约束BodyPartSchema表。关键将如

BodyPartLayer table: FK_BodyPartLayer_BodyPartSchema (BodyPartTagId, LayerTagId) 

这将确保BodyPart /图层组合只能链接时,它们各自的标签也链接。不是特别漂亮,但会达到您的要求。