2 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
您應(yīng)該始終通過(guò)使用“常規(guī)” FOREIGN KEY來(lái)強(qiáng)制實(shí)現(xiàn)引用完整性。
簡(jiǎn)而言之,F(xiàn)OREIGN KEY具有以下優(yōu)點(diǎn):
它們已經(jīng)在DBMS中實(shí)現(xiàn)。
它們是聲明性的,自我記錄的和“顯而易見(jiàn)的”。
它們不能被繞過(guò)(除非被明確禁用或刪除)。
他們是正確的。
他們很快。
它們支持級(jí)聯(lián)引用動(dòng)作(例如ON DELETE CASCADE)。
DBMS知道數(shù)據(jù)是相關(guān)的,因此在某些情況下可以找到更好的查詢計(jì)劃。
如果使用的是ORM工具,則它可以自動(dòng)在對(duì)象之間生成引用。
以下是在應(yīng)用程序代碼中強(qiáng)制執(zhí)行引用完整性的相應(yīng)缺點(diǎn):
您正在復(fù)制已經(jīng)完成的工作。
它勢(shì)在必行,可能會(huì)“深埋”在您的應(yīng)用程序源代碼中,并且很難維護(hù)。
具有錯(cuò)誤的單個(gè)客戶端應(yīng)用程序可能會(huì)破壞參照完整性(并破壞數(shù)據(jù))。
您可能會(huì)在應(yīng)用程序代碼中錯(cuò)誤地實(shí)現(xiàn)它們。從一開(kāi)始看起來(lái)很簡(jiǎn)單,但是在并發(fā)環(huán)境中,很容易引入競(jìng)爭(zhēng)條件。
即使正確實(shí)現(xiàn)了它們,您也可能會(huì)使用某種形式的鎖定來(lái)避免爭(zhēng)用情況,這比DBMS中內(nèi)置的經(jīng)過(guò)特別優(yōu)化的FK可能更慢/可擴(kuò)展性更小。
您必須自己實(shí)現(xiàn)級(jí)聯(lián)。
DBMS不知道數(shù)據(jù)是否相關(guān),這可能會(huì)產(chǎn)生次優(yōu)的查詢計(jì)劃。
您可能需要在所選的ORM工具中進(jìn)行更多的手動(dòng)工作。
有這個(gè)名字嗎?
從來(lái)沒(méi)聽(tīng)說(shuō)過(guò)。我聽(tīng)說(shuō)使用了“通用FK”一詞,但這可能不是通用的。
這是好習(xí)慣嗎?
否(請(qǐng)參見(jiàn)上文)。
有性能方面的考慮嗎?
是的(見(jiàn)上文)。
添加回答
舉報(bào)