SQL复杂约束

时间:2014-09-10 16:44:39

标签: sql database database-design constraints

我正在开发一个小型数据库项目,并且遇到了为此数据模式组织复杂约束的问题。

Schema

这里我使用BodyPartTag来描述BodyPart实例中已接受的LayerTag。 问题是如果我要构建一个BodyPart实体,我没有来自相关BodyPartTag的直接约束。我可以创建一个名为'红眼'的BodyPart,BodyPartTag是'Eyes'但是我可以将任何图层附加到BodyPart,即使'Eyes'BodyPartTag只接受'Left Eye','Right Eye'LayerTags。

如何重新组织表以添加这些约束?目前我使用的是“程序化”解决方案,但它需要大量编码才能完成这类任务。

详细信息:白点为1,黑点为MANY。

1 个答案:

答案 0 :(得分:1)

您可以使用复合键而不是代理键来执行此操作。它不是一个很好的方法,但是如果您使用这样的模式,它将提供指定的数据约束。

首先,添加'标记' LayerBodyPart表的主键的键,以便主键现在由两个值组成,即

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

然后使用这些组合键(每个2个值)而不是当前键(单个值)创建BodyPartLayer表。 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 / Layer组合只能在其各自的标签也链接时进行链接。不是特别漂亮,但会达到你的要求。