2014-09-10 127 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 /圖層組合只能鏈接時,它們各自的標籤也鏈接。不是特別漂亮,但會達到您的要求。