我正在設計一個數據庫,但無法弄清楚如何對參照完整性建模。對錶部分的參照完整性
我有以下表
CREATE TABLE Groups
(
GroupId INT PRIMARY KEY,
GroupName VARCHAR(50)
)
CREATE TABLE GroupMembers
(
GroupId INT NOT NULL,
MemberId INT NOT NULL,
MemberName VARCHAR(50),
CONSTRAINT pk_GroupMember PRIMARY KEY (GroupId, MemberId)
)
CREATE TABLE Missions
(
MissionId INT PRIMARY KEY,
GroupId INT NOT NULL,
MissionName VARCHAR(50)
)
CREATE TABLE MissionRollAssignments
(
MissionId INT NOT NULL,
MemberId INT NOT NULL,
MemberRoll VARCHAR(50) --This will probably become RollId and move details to another table
)
每個任務都會有一些任務/相應組的所有成員。將有幾個任務與每個組相關聯,但每個組只有一個任務在給定時間處於活動狀態。
我的問題是:
是否有可能執行爲卷分配referenciay完整性,使得只有成員的相應組(由MissionId給出)的 被選擇?我知道我可以從GUI過濾這個,但是如果我可以在MissionRollAssignments中創建一個FK約束到GroupMembers,同時考慮Mission中指定的GroupId,我會感覺更舒適。
第二個問題是,如果你們認爲這是模擬我的域的好方法,或者我應該嘗試不同的方法。
在此先感謝您的幫助。
最好的問候,
AWER
我一直在試驗這個,它實際上工作正常!謝謝你的幫助。你能否給我一點解釋,說明這是如何完成我想要的? –
嗨sqlvogel。我想我現在明白了,但現在我認爲,通過在MissionRoleAssignments中引入GroupId,現在數據庫不再處於3NF中。我對麼?這是一個問題嗎? –
由於MissionRollAssignments中的MissionId-> GroupId非關鍵依賴關係,您是對的。然而,這個約束仍然被FK約束有效地執行,所以在那裏沒有完整性的損失。在該表中沒有GroupId的替代方案會使執行您所說的業務規則更加困難。這種情況通常出現在SQL中。 SQL對完整性約束的支持非常有限,執行某些業務規則的唯一方法是反規範化。您必須決定在數據庫中執行規則有多大價值。 – sqlvogel