如何在多個表之間建模非常靈活的引用關係?
我的數據庫中有各種不同的實體類型。舉例來說,考慮一個 IMDB 數據庫:
- 電影
- 人
- 演員
- 導向器
- 翻譯
- 還有 20 多張桌子
我的應用程序支持任何這些實體之間的自由形式的多對多關係。
以可維護的方式對此進行建模的明智方法是什麼?
目前,我的應用程序使用帶有“a_id”、“a_type”、“b_id”、“b_type”的表。使用標識表的類型(例如“電影”)。這意味著沒有參照完整性檢查,這讓我感到不安。
有哪些替代方案?唯一想到的是將連結表擴展為每個其他表的列。所以我有
a_movie_id
,a_actor_id
,a_director_id
和b_movie_id
,b_actor_id
,b_director_id
. 然而,雖然這保留了引用完整性,但感覺很奇怪(我以前沒有見過這樣的表)並且我懷疑應用程式碼很難處理它(它必須有一個大的 if 語句來檢查實際引用的內容)。因此,我徵求您的意見 - 是否有一種方便的行業標準方法來模擬這種靈活的關係?
我的數據庫引擎是 SQL Server。
這是基於意見的。我不會試圖建議這裡有最佳實踐。
如果你有演員、導演、電影的單獨表,並且有一個
EntityID
帶有單獨EntityType
列的通用列,你總是需要使用動態 SQL 來查詢它,因為在你知道類型之前,你不會知道要加入哪個表到。另一種選擇是擁有一個包含該類型的通用實體表。您的關係表只有兩列。
然後,您的實體表中有所有屬性的稀疏列,因為導演具有與電影不同的屬性。
而且你很好地索引它,這樣當你想要一個電影列表時,你就不會遍歷所有演員。過濾索引在這里特別方便,這樣您就有了電影的專用索引,其中包括與電影相關的列。
視圖也可以使查詢更容易,但是對於遍歷關係,您可以使用通用表。
我建議您將 SQL Server 2017 中的圖形數據庫視為一種可能的解決方案。您可以將簡單的連結表用於多對多關係,但如果您的關係比您所說的更複雜,您可能會發現圖形數據庫更適合。
無論哪種方式,我認為您需要刪除單連結表解決方案,因為這是糟糕的數據庫設計。兩個實體之間的每個多對多關係都應該有一個單獨的連結表。