2013-04-26 113 views
0

我有一個名爲Tbl_Event的表,用於存儲即將發生的事件的基本信息。兩個表之間的多個外鍵

Tbl_Event 

EventID Description Location 

我有我創建了一個新的表

tbl_Event_Staff 

    RecordID StaffID EventID 

,STAFFID另一個表叫工作人員,存儲人員信息

Tbl_Staff 

StaffID Name 

現在每個事件可以有多個職員,爲實現這一和EventID對它們有一個COMBINED唯一約束。 有一個附加條件,其中一名工作人員需要成爲活動的主管。什麼是最佳的解決方案來實現這一目標,我應該在tbl_event添加一個額外的列 - SupervisorID

Tbl_Event 

EventID Description Location SupervisorID 

並將其鏈接到tbl_Event_Staff上,STAFFID(在這種情況下,將是這兩個表之間的外鍵 - 事件ID和StaffID)

或 *我不認爲這是冗餘數據的最佳解決方案。

我應該向tbl_Event_Staff - isSupervisor(bool)添加一個額外的列,並且每行都有一個布爾變量,表示該EVENT的員工是否爲主管。

tbl_Event_Staff 

    RecordID StaffID EventID IsSupervisor 
     1  10  3   true 
     2  20  3   false 
     3  30  3   false 

是否有其他解決方案?

回答

1

我會使用第二種方法,並且,但是可能的話,會在該表上設置約束,使得每個EventID只有一個行可以是主管。

如何做到這一點的細節因數據庫而異 - 在某些系統中,可能必須使用觸發器強制執行。 - 有沒有理智的理由使用前綴在SQL區分對象類型 - 語法

CREATE UNIQUE INDEX ON EventStaff (EventID) WHERE IsSupervisor = 1 

我也建議與tbl_前綴廢除:在SQL Server,它可以使用篩選指標完成的語言意味着你可以純粹通過它在查詢中的位置來告訴對象的類型 - 除了一種情況。

我提到的情況是視圖和表可能會出現在查詢中的相同位置並且無法區分。然而,這是一個好的事情 - 一般來說,你不應該在意你正在處理的對象是一個表還是一個視圖 - 數據庫開發者應該可以自由地創建一個不同的表結構並重新創建舊的結構使用原始表格中的視圖 - 現有查詢不應受到影響。

+0

感謝您的輸入。這是解決此問題的最佳方法嗎?我將擁有大量冗餘數據,並且更新數據庫將會困難得多。雖然,每當用戶將職員設置爲主管時,都會想到它,但我可以遍歷該事件的所有staffID,並將IsSupervisor標誌設置爲false,但是該表不會被正常化。猜這就是我必須付錢的價格。 – 2013-04-26 06:41:43

+0

@ Abhi.Net - 好吧,到目前爲止你有兩個答案,我們不同意。以此爲標誌,說明沒有「最佳方法」。只有您知道您需要從這些數據結構中支持哪些查詢和操作。而且,正如我在旁邊指出的那樣,您可以(從任一設計中)構建模仿其他設計的視圖 - 因此,如果稍後決定其他結構更合適,則可以重新構建它,然後只需重新編寫這些視圖查詢從重新設計中受益。 – 2013-04-26 06:44:55

+0

多數民衆贊成我認爲,我強調要獲得最佳解決方案的唯一原因是,這是ER圖分配的一部分,我需要創建一個數據庫結構並規範化它。除了這部分以外,一切都完成了,我不確定採用哪種方法,但我可能會選擇第二種,然後留下評論來解釋我的選擇。 – 2013-04-26 06:47:51

1

第一種解決方案更好,因爲它可以自動防止您創建具有多個主管和/或具有多個主管的事件的事件:當事件的supervisor_id列不可爲空時,您的RDBMS可確保每個主管有一個主管事件。

如果你需要得到與true/false指標標誌着主管一表的形式你的結果,你可以隨時通過加入到Tbl_Event,並比較Tbl_Event.supervisortbl_Event_Staff.StaffID得到這一結果。

+0

但在列與外鍵之間建立外鍵關係並不是主鍵?在tbl_event和tbl_event_staff中,staffid和supervisorID都是非關鍵屬性。 – 2013-04-26 03:21:52

+0

@ Abhi.Net我不會將它鏈接到'tbl_Event_Staff',我會直接將它鏈接到'Tbl_Staff',其中'StaffID'是主鍵。 – dasblinkenlight 2013-04-26 03:26:28

+0

我其實也考慮過這個問題,但在這種情況下,我可以在tbl_staff的工作人員標識中添加staffId,而tbl_staff_event中沒有記錄。這意味着員工在事件中作爲主管工作,但在tbl_staff_event中沒有記錄。 – 2013-04-26 03:33:19