Sql-Server
可以選擇更具體的關係
原諒我的標題,我想不出任何能準確描述我在說什麼的東西。
我目前有以下關係。
CREATE TABLE Events ( ID INT IDENTITY(1,1) NOT NULL, Name NVARCHAR(64) NOT NULL, PRIMARY KEY(ID) ) CREATE TABLE Locations ( ID INT IDENTITY(1,1) NOT NULL, EventID INT NOT NULL, Name NVARCHAR(64) NOT NULL, PRIMARY KEY(ID) ) ALTER TABLE Locations ADD FOREIGN KEY(EventID) REFERENCES Events(ID)
基本上,一個事件可以有零個或多個位置。我現在想要的是將捐贈與事件相關聯,或者更具體地將其與位置相關聯。
CREATE TABLE Donations ( ID INT IDENTITY(1,1) NOT NULL, EventID INT NOT NULL, LocationID INT NULL, -- this is optional PRIMARY KEY(ID) ) ALTER TABLE Donations ADD FOREIGN KEY(EventID) REFERENCES Events(ID) ALTER TABLE Donations ADD FOREIGN KEY(LocationID) REFERENCES Locations(ID)
但是,如果
LocationID
指定了 ,那麼它LocationID
應該是屬於指定的位置EventID
。在指定的情況下LocationID
,它會變得EventID
多餘,因此不再標準化。我提出的模式是否被認為是好的形式,或者我應該將兩者都設為可空,
EventID
然後LocationID
強制執行一個檢查約束,該約束要麼排他地設置,EventID
要麼LocationID
應該設置?在路上,我們將進行註冊。我提議的內容與此類似:
CREATE TABLE Users ( ID INT IDENTITY(1,1) NOT NULL, Username NVARCHAR(64) NOT NULL, PRIMARY KEY(ID) ) CREATE TABLE Registrations ( UserID INT NOT NULL, EventID INT NOT NULL, LocationID INT NULL, PRIMARY KEY(UserID, EventID) ) ALTER TABLE Registrations ADD FOREIGN KEY(UserID) REFERENCES Users(ID) ALTER TABLE Registrations ADD FOREIGN KEY(EventID) REFERENCES Events(ID) ALTER TABLE Registrations ADD FOREIGN KEY(LocationID) REFERENCES Locations(ID)
本質上,使用者可以註冊一次事件(無論他們是否選擇了位置)。如果我將主鍵
EventID
設為可空以防止EventID
和LocationID
.我們目前用來解決這個問題的解決方案是我們沒有
Locations
桌子。CREATE TABLE Events ( ID INT IDENTITY(1,1) NOT NULL, Name NVARCHAR(64) NOT NULL, ParentEventID INT NULL, -- when null it's an event, otherwise it's a location for the eventid it references PRIMARY KEY(ID) ) ALTER TABLE Events ADD FOREIGN KEY(EventID) REFERENCES Events(ID)
這解決了
EventID
數據LocationID
冗餘問題。然而,我發現這種結構很奇怪,因為事件和地點在概念上是不同的東西。在未來,我們可能會有特定於事件和位置的欄位。判斷這個
Events
表中的記錄是事件還是位置,如果PrimaryEventID
欄位是NULL
,那麼它是一個事件,否則它是那個位置EventID
。請讓我知道這些業務需求的良好架構。
代替:
ALTER TABLE Donations ADD FOREIGN KEY(EventID) REFERENCES Events(ID) ALTER TABLE Donations ADD FOREIGN KEY(LocationID) REFERENCES Locations(ID)
我會這樣做:
ALTER TABLE Donations ADD FOREIGN KEY(EventID) REFERENCES Events(ID) ALTER TABLE Donations ADD FOREIGN KEY(EventID, LocationID) REFERENCES Locations(EventID, ID)
這將保證“如果指定了 LocationID,則該 LocationID 應該是屬於指定 EventID 的位置”。
完成後,您的方法很有意義。