Sql-Server

如何在多個表之間建模非常靈活的引用關係?

  • January 9, 2019

我的數據庫中有各種不同的實體類型。舉例來說,考慮一個 IMDB 數據庫:

  • 電影
  • 演員
  • 導向器
  • 翻譯
  • 還有 20 多張桌子

我的應用程序支持任何這些實體之間的自由形式的多對多關係。

以可維護的方式對此進行建模的明智方法是什麼?

目前,我的應用程序使用帶有“a_id”、“a_type”、“b_id”、“b_type”的表。使用標識表的類型(例如“電影”)。這意味著沒有參照完整性檢查,這讓我感到不安。

有哪些替代方案?唯一想到的是將連結表擴展為每個其他表的列。所以我有a_movie_id, a_actor_id,a_director_idb_movie_id, b_actor_id, b_director_id. 然而,雖然這保留了引用完整性,但感覺很奇怪(我以前沒有見過這樣的表)並且我懷疑應用程式碼很難處理它(它必須有一個大的 if 語句來檢查實際引用的內容)。

因此,我徵求您的意見 - 是否有一種方便的行業標準方法來模擬這種靈活的關係?

我的數據庫引擎是 SQL Server。

這是基於意見的。我不會試圖建議這裡有最佳實踐。

如果你有演員、導演、電影的單獨表,並且有一個EntityID帶有單獨EntityType列的通用列,你總是需要使用動態 SQL 來查詢它,因為在你知道類型之前,你不會知道要加入哪個表到。

另一種選擇是擁有一個包含該類型的通用實體表。您的關係表只有兩列。

然後,您的實體表中有所有屬性的稀疏列,因為導演具有與電影不同的屬性。

而且你很好地索引它,這樣當你想要一個電影列表時,你就不會遍歷所有演員。過濾索引在這里特別方便,這樣您就有了電影的專用索引,其中包括與電影相關的列。

視圖也可以使查詢更容易,但是對於遍歷關係,您可以使用通用表。

我建議您將 SQL Server 2017 中的圖​​形數據庫視為一種可能的解決方案。您可以將簡單的連結表用於多對多關係,但如果您的關係比您所說的更複雜,您可能會發現圖形數據庫更適合。

無論哪種方式,我認為您需要刪除單連結表解決方案,因為這是糟糕的數據庫設計。兩個實體之間的每個多對多關係都應該有一個單獨的連結表。

連結 1

連結 2

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