Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL复杂约束_Sql_Database_Database Design_Constraints - Fatal编程技术网

SQL复杂约束

SQL复杂约束,sql,database,database-design,constraints,Sql,Database,Database Design,Constraints,我正在做一个小数据库项目,在组织这个数据模式的复杂约束时遇到了一个问题 在这里,我使用BodyPartTag来描述BodyPart实例中接受的LayerTag。 问题是,如果要构建BodyPart实体,则关联的BodyPartTag没有直接约束。我可以创建一个名为“红眼”的身体部位,BodyPartTag是“眼睛”,但我可以附加到身体部位的任何层,即使“眼睛”BodyPartTag只接受“左眼”、“右眼”图层标记 如何重新组织表以添加这些约束?目前,我使用的是“编程”解决方案,但它需要大量的编

我正在做一个小数据库项目,在组织这个数据模式的复杂约束时遇到了一个问题

在这里,我使用BodyPartTag来描述BodyPart实例中接受的LayerTag。 问题是,如果要构建BodyPart实体,则关联的BodyPartTag没有直接约束。我可以创建一个名为“红眼”的身体部位,BodyPartTag是“眼睛”,但我可以附加到身体部位的任何层,即使“眼睛”BodyPartTag只接受“左眼”、“右眼”图层标记

如何重新组织表以添加这些约束?目前,我使用的是“编程”解决方案,但它需要大量的编码,这似乎不适合此类任务


详细信息:白点是一个,黑点是多个。

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

首先,将“标记”键添加到
主体部分
表的主键,以便主键现在由两个值组成,即

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是相关层的逻辑“聚合”。示例中为
左眼
右眼
层或层标记?层标记。图层应该是“红色左眼”或“绿色右眼”左右。。。LayerTag只是一种“类型”的图层。请将其添加到问题和示例中。这将有助于更好地理解你的问题