Foreign-Key
儲存具有來自同一個外部表的恰好 n 個多個外鍵的記錄的替代方法,其中關係不能重複
假設有實體被稱為
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)
假設關係是反反身的。