Foreign-Key

儲存具有來自同一個外部表的恰好 n 個多個外鍵的記錄的替代方法,其中關係不能重複

  • March 14, 2020

假設有實體被稱為singulars,實體被稱為relationships

singulars組成一個relationships實體恰好需要兩個。

單數不能relationships以任何順序在 中的其他地方重複。

一種建模方法可能是這樣的:

+----------------+
|relationships   |         +----------+
+----------------+         |singulars |
|id              |         +----------+
|singular_id_1   <---------+id        |
|singular_id_2   <---+     |attribute1|
|pair_description|         |attribute2|
|pair_date       |         |          |
|                |         +----------+
+----------------+

使用這種模式,有必要檢查兩個外鍵欄位relationships是否存在singulars,可能在任一側。順序無關緊要,但它是在模式中定義的……所以查詢最終會得到一些AND/OR組和案例。

擴展這種方法可能是為每對儲存兩條記錄,singular_id_[n]兩邊交換。雖然這解決了一些查詢的複雜性,但它會引入額外的複雜性使其不可行。

使用中間表似乎是一種潛在的解決方案:

+----------------+       +-----------------------+
|relationships   |       |singulars_relationships|        +----------+
+----------------+       +-----------------------+        |singulars |
|id              <-------+relationship_id        |        +----------+
|pair_description|       |singular_id            +-------->id        |
|pair_date       |       |                       |        |attribute1|
|                |       +-----------------------+        |attribute2|
+----------------+                                        |          |
                                                         +----------+

所以記錄最終可能是這樣的:

+----------------------------------+
|relationships                     |
+----------------------------------+
|id   pair_description   pair_date |
+----------------------------------+
|1    Fizz buzz blitz    2022-02-20|
|2    Blitz buzz fizz    2022-02-22|
+----------------------------------+

+----------------------------------+
|singulars_relationships           |
+----------------------------------+
|relationship_id   singular_id     |
+----------------------------------+
|1                 1               |
|1                 2               |
|2                 3               |
|2                 4               |
+----------------------------------+

+-----------------------------+
|singulars                    |
+-----------------------------+
|id   attribute1   attribute2 |
+-----------------------------+
|1    Fizz         Blitz      |
|2    Buzz         Foo        |
|3    Bar          World      |
|4    Blorg        Hello      |
+-----------------------------+

在那裡,singulars_relationships是定義對的地方。如果其中singular_id存在 a,則它已經成對存在。這種模式可能出現的一個問題可能是三個或更多singular_id的 s 最終可能與 a 相關聯relationship_id,然後“恰好 n”約束就會受到影響。

這種情況有官方術語嗎?還有其他理論和替代方案?

這種情況有官方術語嗎?

是的。這是一個對稱關係。這裡的“關係”與“關係數據庫”中的含義相同。RDBMS 是圍繞儲存關係設計的數據庫管理系統。然而,RDBMS 沒有儲存對稱關係的本地方式。您要麼必須將兩個元組(例如 (a,b) 和 (b,a))儲存為單獨的行,要麼必須使用某種約定來僅儲存一個元組。一種常見的方法是對 FK 使用檢查約束。

例如

check (singular_id_1 < singular_id_2)

假設關係是反反身的

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