Foreign-Key
什麼問題阻止了非唯一列上外鍵定義明確的行為?
在我的菜鳥看來,我覺得在序列化環境中,這應該不是問題。
那是對的嗎?如果不是,請向我解釋為什麼外鍵在非唯一列上的行為沒有明確定義。
未明確定義的行為是否包括如果外鍵的引用列不是唯一的,那麼即使有有效條目,它也會刪除鍵控行?
您無法在 PostgreSQL 中創建針對沒有唯一約束的關係的外鍵。聽說您可以在 MySQL 中使用,我感到有些驚訝。
這確實違反了“外鍵”的原則——如果你可以有多個值,那麼目標實際上根本就不是鍵,它只是另一個數據列。
也就是說,PostgreSQL 不只是為了好玩而阻止您這樣做。AFAIK 其外鍵實現需要唯一的 b-tree 索引,沒有它們就無法正常執行。唯一索引有一些重要的屬性,特別是關於鎖定和事務更新。
理論上我猜 Pg 可以讓你使用任何索引,但是它必須處理當兩個並發事務各自刪除兩個關鍵行之一時發生的混亂。每個送出單獨地保持密鑰關係不變,但如果兩者都送出,則必須觸發級聯刪除(必須在送出之前發生)或錯誤回滾。因此 PostgreSQL 必須對事務進行序列化,強制一個接一個地發生,這意味著對 key 具有相同值的所有其他行進行鎖定,而不管它們是否是查詢的目標。即使那樣它也不能完全完成這項工作,因為並發插入可以重新驗證密鑰;Pg 確實需要使用謂詞鎖。
拋開實現細節不談,針對非唯一列的外鍵實際上能為您帶來什麼?您是否嘗試為非可選的 m:n 關係建模?
如果我必須這樣做,我會用我自己的觸發器來做,但我會非常小心地做,因為很難做到正確。