我工作的一個數據庫,但我還挺新的這個所以我今天碰到了一個問題。 我有一些表格:OFFICE,ROOM,EMPLOYEE和DOCUMENT。文檔必須指定發件人,可以是單個員工,整個房間或整個辦公室,因此必須具有對這些表的主鍵的引用。 我應該做一個「平行」表來處理它(例如,我已經完成了一個處理多個收件人文檔)還是有另一種方式? 謝謝多參考在SQL
多參考在SQL
回答
我會傾向於有一個外鍵,每個可以確保只有一個的值都將檢查約束的三個表。這樣,您仍然可以使用標準參照完整性。順便說一句,這假定業務規則是每個文檔必須有一個且只有一個發件人。
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)
)
是的,文檔只能有一個發件人,所以我可能會使用檢查約束解決方案。謝謝 – AGarofoli 2010-05-19 12:15:52
您正試圖創建條件的外鍵,你不能在SQL Server執行。我認爲創建一個表來保存文檔和發件人是一個好主意,但是你將無法創建外鍵。儘管您可以實施Check Constraint來控制數據。
我不太瞭解檢查限制,但它似乎是最好的解決方案。感謝您的鏈接! – AGarofoli 2010-05-19 12:38:54
我會並行表,因爲你提到的實現這一點。這些表是這樣:
OfficeDocuments(OfficeID,DocumentID)
RoomDocuments(RoomID,DocumentID)
EmployeeDocuments(僱員,DocumentID)
您可以用設計設計更加靈活查詢像這樣,例如參加房間和辦公室表格以獲取僱員名單。
你選擇應取決於你需要如何靈活的是方法。如果僅設計一個或兩個查詢來處理此表,則可以使用非規格化表(對於可以作爲發件人的每種類型的表使用檢查約束和多個屬性)。
我需要的唯一一個查詢是讓我檢查誰寫了一個文檔,檢查約束會比「並行表」方法更容易,但是你是對的,這是一個更靈活的解決方案。現在我不需要靈活,我可能需要儘快切換解決方案。 也許我會試試看,哪一個更好,謝謝! – AGarofoli 2010-05-19 12:31:02
- 1. 多參考
- 2. 多線程參考?
- 3. IS參考參考在C++?
- 4. 在html中添加更多參考輸入參考
- 5. SQL報告服務參考
- 6. 刷新SQL Server參考
- 7. 顯示參考列SQL
- 8. SQL Server參考計算列
- 9. 製作參考通過SQL
- 10. SQL參考integerity遞歸
- 11. 參考透視型遊標在PL/SQL
- 12. Simba DB SQL參考在哪裏?
- 13. Excel /多個參考標準
- 14. VSCode多個項目參考
- 15. MySQL的多個ID參考
- 16. 防止jQuery多重參考
- 17. 多個表名參考
- 18. 多維陣列參考
- 19. 參考多個工作表
- 20. 參考在XSD
- 21. 參考在Java
- 22. 參考在foreach
- 23. 參考在Java
- 24. 參考在C++
- 25. C++參考shared_ptr vs參考
- 26. NHibernate的多對多的參考幫助
- 27. 參考從主鍵多到許多表
- 28. SQL挑戰 - 使用多個參考日期進行中斷
- 29. C++參考和參考參數
- 30. 參考參數
你可以發佈更多關於您的架構,我還是不明白這一點,當然 – vodkhang 2010-05-17 15:13:31
,我有3個表:辦公室,房間和員工。他們有自己的ID(他們的主鍵)和一些列與其他信息。然後還有另一個表DOCUMENT,它有一個列,發件人,可以是其他表(例如單個員工,一個房間或整個辦公室)中的一個,也可以是一個,所以我想讓它指向另一個表的主鍵(因此,如果該文件是寫的房間A2,id爲ab34,我可以在「發件人」的地方寫ab34,如果是員工凱文,id爲kv45,我可以寫kv45)。希望它有幫助 – AGarofoli 2010-05-19 12:13:48