2013-10-24 36 views
0

我有一個表名Service(product, loca, from_agent, to_agent)觸發強制外鍵

product參考Product(pno)

from_agent引用Customer(cno) U Driver(drno) U Airline(Ano)

to_agent引用Customer(cno) U Driver(drno) U Airline(ano)

cno = Customer Number這是 「Customer」 具有這樣as name, address

drno = 012的其他細節另一個表名這是另一種表名「Driver」,其具有其它細節,例如name, address

ano = Airline Number這是另一種表名「Airline」,其具有其它細節,例如depport, depttime,arrtime等。

想寫一個將強制執行的觸發器,在進行任何更改之前,將檢查product表中的外鍵。假設本地映射透明。

+3

爲什麼你不想要一個* real *外鍵約束。 –

+0

,因爲我希望用戶提及存儲在遠程位置的數據片段的名稱和位置。即時通訊分發數據庫,​​並有數據片段和存儲在不同的位置 – JamesBond

回答

0

解決此類需求的公認做法是而不是編寫存儲過程代碼以強制執行參照完整性。不管它寫得多好,如果你繼續這樣的解決方案,你已經失敗了。

您已經失敗了,因爲這樣的解決方案最終總是會失敗並導致數據完整性問題,或者寫得非常有效以至於始終成功,但它需要一個分佈式事務,從而大大低效地鎖定涉及的表,你會有併發的會話表現惡夢。

公認的做法是使用數據庫平臺的穩健,經過充分測試的高性能複製功能,然後通過唯一鍵和外鍵傳統建立參照完整性,讓數據庫執行它所做的工作比編寫存儲過程代碼來執行參照完整性好幾千倍。

在某個時間點,每個認真的數據庫開發人員都在進行自己的複製,除非在最簡單的情況下,他們總是失敗慘敗。