Sql-Server

可以選擇更具體的關係

  • January 30, 2013

原諒我的標題,我想不出任何能準確描述我在說什麼的東西。

我目前有以下關係。

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設為可空以防止EventIDLocationID.

我們目前用來解決這個問題的解決方案是我們沒有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 的位置”。

完成後,您的方法很有意義。

引用自:https://dba.stackexchange.com/questions/33618