2010-05-17 46 views
0

我工作的一個數據庫,但我還挺新的這個所以我今天碰到了一個問題。 我有一些表格:OFFICE,ROOM,EMPLOYEE和DOCUMENT。文檔必須指定發件人,可以是單個員工,整個房間或整個辦公室,因此必須具有對這些表的主鍵的引用。 我應該做一個「平行」表來處理它(例如,我已經完成了一個處理多個收件人文檔)還是有另一種方式? 謝謝多參考在SQL

+0

你可以發佈更多關於您的架構,我還是不明白這一點,當然 – vodkhang 2010-05-17 15:13:31

+0

,我有3個表:辦公室,房間和員工。他們有自己的ID(他們的主鍵)和一些列與其他信息。然後還有另一個表DOCUMENT,它有一個列,發件人,可以是其他表(例如單個員工,一個房間或整個辦公室)中的一個,也可以是一個,所以我想讓它指向另一個表的主鍵(因此,如果該文件是寫的房間A2,id爲ab34,我可以在「發件人」的地方寫ab34,如果是員工凱文,id爲kv45,我可以寫kv45)。希望它有幫助 – AGarofoli 2010-05-19 12:13:48

回答

1

我會傾向於有一個外鍵,每個可以確保只有一個的值都將檢查約束的三個表。這樣,您仍然可以使用標準參照完整性。順便說一句,這假定業務規則是每個文檔必須有一個且只有一個發件人。

Create Table Document 
(
    SenderEmployeeId ... 
    , SenderRoomId ... 
    , SenderOfficeId.... 
    , Constraint CK_Document_SingleSender Check (Case 
                When SenderEmployeeId Is Not Null And SenderRoomId Is Null And SenderOfficeId Is Null Then 1 
                When SenderRoomId Is Not Null And SenderEmployeeId Is Null And SenderOfficeId Is Null Then 1 
                When SenderOfficeId Is Not Null And SenderEmployeeId Is Null And SenderRoomId Is Null Then 1 
                Else 0 
                End = 1) 
)
+0

是的,文檔只能有一個發件人,所以我可能會使用檢查約束解決方案。謝謝 – AGarofoli 2010-05-19 12:15:52

0

您正試圖創建條件的外鍵,你不能在SQL Server執行。我認爲創建一個表來保存文檔和發件人是一個好主意,但是你將無法創建外鍵。儘管您可以實施Check Constraint來控制數據。

+0

我不太瞭解檢查限制,但它似乎是最好的解決方案。感謝您的鏈接! – AGarofoli 2010-05-19 12:38:54

0

我會並行表,因爲你提到的實現這一點。這些表是這樣:

OfficeDocuments(OfficeID,DocumentID)

RoomDocuments(RoomID,DocumentID)

EmployeeDocuments(僱員,DocumentID)

您可以用設計設計更加靈活查詢像這樣,例如參加房間和辦公室表格以獲取僱員名單。

你選擇應取決於你需要如何靈活的是方法。如果僅設計一個或兩個查詢來處理此表,則可以使用非規格化表(對於可以作爲發件人的每種類型的表使用檢查約束和多個屬性)。

+0

我需要的唯一一個查詢是讓我檢查誰寫了一個文檔,檢查約束會比「並行表」方法更容易,但是你是對的,這是一個更靈活的解決方案。現在我不需要靈活,我可能需要儘快切換解決方案。 也許我會試試看,哪一個更好,謝謝! – AGarofoli 2010-05-19 12:31:02