2015-07-21 24 views
0

我無法弄清楚如何構建數據庫來模擬我正在嘗試執行的操作。用於將項目分配給用戶或組的數據庫結構,但不能同時使用

比方說,作爲一個例子,我有以下表UserGroup它們都具有以下幾列IdName

現在,我有一個名爲Item的對象。可以將Item分配給UserGroup,但不能同時分配給UserGroup。指定爲UserGroupItem也是有效的。有沒有辦法在一個有意義的數據庫中展示出來?我是否會被迫在記錄插頁上使用自定義約束,該記錄插頁檢查是否邏輯(其中項目不能同時指定給UserGroup)是否有效?

我覺得我絕對沒有辦法成爲第一個遇到這個問題的人,但我沒有看到類似的問題。謝謝。

對於上下文,我只是試圖設計這個,所以我可以使用一個數據庫模型,這對我來說很有意義,我最終將在C#中創建實體框架中的Code-First。我沒有用它來標記它,因爲它似乎並不足夠。

回答

0

這裏有一種方法可以執行您在數據庫級別描述的約束。

實現你Item表所示:

create table [dbo].[Item] (
    pkid int identity primary key, 
    AssignedTo_UserId int null, 
    AssignedTo_GroupID int null, 
    constraint fk_User foreign key (AssignedTo_UserId) references [dbo].[User] (Id), 
    constraint fk_Group foreign key (AssignedTo_GroupID) references [dbo].[Group] (Id), 
    constraint user_xor_group check (not (AssignedTo_UserId is not null and AssignedTo_GroupID is not null)) 
); 

,您有兩種分配領域,一爲User,一個用於Group。外鍵約束確保Item不能分配給不存在的UserGroup,並且檢查約束確保AssignedTo_UserIdAssignedTo_GroupID中只有一個具有非空值(即,您的項目只分配給一次只有一個用戶或組,而不是兩者)。

但是,那張桌子的設計看起來很有趣,它可能非常適合您的特定用例(無論這些用例是什麼),但似乎不太可能。

如果你想象像在同一列中有兩個相互排斥的外鍵約束,即表Item有一個單一的AssignedTo列必須要麼GroupUserId匹配,我不知道有沒有辦法做到那。 (你可以在同一引用不同表兩個約束條件,但他們會經常被應用,例如AssignedTo必須同時匹配GroupUser,這不是你問什麼)。

如果您的UserGroup表格與它們看起來相似(即只有名稱和Id列),那麼@Brian's answer幾乎肯定是要走的路。如果他們有很多不同的列,那麼在你的db設計中可能會有一個子分類的爭論,你會想要通過設計的權衡來選擇最適合你的需求的。

+0

這是我提出的設計之一,我想不出任何其他能夠滿足我需要做的事情以及我的用戶和角色當前設置的方式(作爲單獨的表格 - 由默認的.NET Identity Framework指定)我可能不得不使用這個。我會把它打開一段時間,然後回頭看看是否有更多的點擊,但我想確保我沒有忽略這裏很簡單的東西......非常感謝您的意見。 – KSib

+0

我可能會跟着這個去做,並用代碼隱藏邏輯來補充它。謝謝。 – KSib

1

我想一個辦法來處理它將是使用戶和組所有一個實體,但用一個標誌屬性定義,以告知它是一個用戶還是一個組。因此,例如創建一個名爲Credentials的表,並且您可以添加一個名爲Type的標誌,該標誌將設置爲指示它是用戶還是組的值。這樣,您可以在Item表中只有一個CredentialID字段,並驗證它是否與Credentials表中的記錄匹配。可能有些原因可能導致你不想這樣做,但這是一個可以考慮的選擇。

如果您的GroupUser表格並不簡單,那麼這裏有另一種方法來看待它可能是更好的解決方案。您可以考慮將您的Group表作爲您的Credential表。 Item表中的每個記錄只能鏈接到一個Group。每個用戶都有一個組,它是唯一的成員。如果需要,您可以用標記在Group表中標記此記錄,以便您的用戶界面不會更改它,還可以知道它是否真的是一個組,或者它是否只是單個用戶(如有必要)。這不僅消除了約束中的條件邏輯,而且還消除了您的應用程序中的所有條件邏輯。項目只能鏈接到一個組,並且一個組鏈接到它的用戶/用戶。

+0

這當然是一種選擇。感謝您的建議。 – KSib

+0

我添加了第二段來構建最初的想法。 –

相關問題