什么是數(shù)據(jù)庫(kù)的邏輯外鍵?送分題,但你能扛得住追問(wèn)么?
共 2952字,需瀏覽 6分鐘
·
2024-08-12 13:30
此答案節(jié)選自我們團(tuán)隊(duì)的 面試?guó)喫㈩}小程序,更多 大廠常問(wèn)面試題,可以點(diǎn)擊下面的小程序進(jìn)行閱讀哈!
目前這個(gè)面試刷題小程序剛出,詳細(xì)可以看這篇文章:這次,終于不用再被八股文吊打了!
回歸面試題!
回答重點(diǎn)
邏輯外鍵是一種在 應(yīng)用程序?qū)用嫔?nbsp;管理和維護(hù)數(shù)據(jù)完整性的方法,而不是通過(guò)數(shù)據(jù)庫(kù)本身的外鍵約束。主要是利用應(yīng)用程序代碼來(lái)保證引用的完整性。
邏輯外鍵的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
-
靈活性高:應(yīng)用程序?qū)用婵刂疲梢愿`活地實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)邏輯。 -
性能優(yōu)化:避免了數(shù)據(jù)庫(kù)層面的約束檢查,可以在某些情況下提高性能(詳細(xì)看擴(kuò)展知識(shí))。 -
跨數(shù)據(jù)庫(kù)兼容性:邏輯外鍵在不同類型的數(shù)據(jù)庫(kù)之間更容易遷移。
缺點(diǎn):
-
代碼復(fù)雜性增加:需要在應(yīng)用程序代碼中手動(dòng)實(shí)現(xiàn)和維護(hù)引用完整性,增加了代碼的復(fù)雜性和錯(cuò)誤的可能性。 -
一致性風(fēng)險(xiǎn):如果應(yīng)用程序代碼未正確實(shí)現(xiàn)引用完整性檢查,可能導(dǎo)致數(shù)據(jù)不一致。 -
維護(hù)成本高:邏輯外鍵需要開發(fā)人員持續(xù)關(guān)注和維護(hù),增加了維護(hù)成本。
物理外鍵的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
-
自動(dòng)維護(hù)引用完整性:數(shù)據(jù)庫(kù)會(huì)自動(dòng)檢查和維護(hù)外鍵約束,確保數(shù)據(jù)的一致性。 -
減少應(yīng)用層復(fù)雜性:開發(fā)人員不需要手動(dòng)管理引用完整性,減少了代碼的復(fù)雜性和錯(cuò)誤的可能性。 -
數(shù)據(jù)完整性保障:數(shù)據(jù)庫(kù)層面的約束能夠更有效地防止非法數(shù)據(jù)的插入或更新。
缺點(diǎn):
-
性能開銷:外鍵約束會(huì)增加插入、更新和刪除操作的開銷,特別是在處理大量數(shù)據(jù)時(shí)。 -
遷移和復(fù)制的復(fù)雜性:在進(jìn)行數(shù)據(jù)庫(kù)遷移或復(fù)制時(shí),外鍵約束可能會(huì)增加復(fù)雜性,需要小心處理。 -
靈活性較低:物理外鍵在某些復(fù)雜業(yè)務(wù)邏輯下可能不夠靈活,需要更多的手動(dòng)控制。
擴(kuò)展知識(shí)
邏輯外鍵實(shí)現(xiàn)例子
比如插入一筆訂單的時(shí)候,先判斷這個(gè)用戶是否存在:
// 檢查引用完整性
public void insertOrder(Order order) {
if (!customerExists(order.getCustomerId())) {
throw new IllegalArgumentException("面試?guó)営脩舨淮嬖?);
}
// 插入訂單
orderRepository.save(order);
}
private boolean customerExists(Long customerId) {
return customerRepository.existsById(customerId);
}
如果是復(fù)雜的業(yè)務(wù),例如還需要判斷用戶是否是已注銷、是否被凍結(jié)等等,此時(shí)僅需修改 customerExists 就能實(shí)現(xiàn),而物理外鍵就沒(méi)辦法實(shí)現(xiàn)這么靈活的需求了。
為什么不推薦使用數(shù)據(jù)庫(kù)的外鍵?
阿里巴巴 Java 開發(fā)手冊(cè)寫到了:
可以看到,主要是因?yàn)閿?shù)據(jù)庫(kù)的外鍵會(huì)產(chǎn)生級(jí)聯(lián)更新從而導(dǎo)致性能問(wèn)題。
因?yàn)楝F(xiàn)在很多互聯(lián)網(wǎng)公司都是高并發(fā)大流量場(chǎng)景,所以一般互聯(lián)網(wǎng)公司不推薦使用外鍵。
數(shù)據(jù)庫(kù)外鍵性能問(wèn)題盤點(diǎn)
1)級(jí)聯(lián)更新
按照手冊(cè)舉例,如果學(xué)生表的 ID 被修改,數(shù)據(jù)庫(kù)同時(shí)需要改成績(jī)表中的對(duì)應(yīng)的學(xué)生 ID,如果還有其他關(guān)聯(lián)表則都需要被修改。
在高并發(fā)數(shù)據(jù)量大的情況下,一次修改會(huì)產(chǎn)生意料之外的級(jí)聯(lián)更新使得數(shù)據(jù)庫(kù)壓力過(guò)大,導(dǎo)致系統(tǒng)其他操作數(shù)據(jù)庫(kù)的請(qǐng)求阻塞,很可能導(dǎo)致系統(tǒng)全面崩盤。
2)檢查維護(hù)
還是拿學(xué)生成績(jī)舉例,因?yàn)樵O(shè)置了外鍵,插入成績(jī)表對(duì)應(yīng)的學(xué)生 ID 時(shí),數(shù)據(jù)庫(kù)需要去檢查這個(gè)學(xué)生 ID 在對(duì)應(yīng)的學(xué)生表是否存在,來(lái)保證數(shù)據(jù)外鍵完整性約束。
除了插入,刪除、更新相關(guān)外鍵,數(shù)據(jù)庫(kù)都需要去檢查數(shù)據(jù)的完整性,這就產(chǎn)生了性能開銷。
3)鎖問(wèn)題
如果多個(gè)事務(wù)并發(fā)修改學(xué)生表,那么對(duì)應(yīng)鎖定的數(shù)據(jù)涉及的成績(jī)表也需要被鎖定,同理并發(fā)修改成績(jī)表,那么對(duì)應(yīng)的學(xué)生的表的數(shù)據(jù)也需要被鎖定。
關(guān)聯(lián)外鍵越多鎖定的數(shù)據(jù)也就越多。鎖的數(shù)據(jù)多除了性能問(wèn)題,還可能會(huì)帶來(lái)死鎖的問(wèn)題。
數(shù)據(jù)庫(kù)外鍵業(yè)務(wù)問(wèn)題盤點(diǎn)
1)無(wú)法支持復(fù)雜的業(yè)務(wù)控制
不說(shuō)其他復(fù)雜的情況,就拿刪除數(shù)據(jù)使用邏輯刪除的情況,數(shù)據(jù)庫(kù)的外鍵就無(wú)法滿足級(jí)聯(lián)修改,還是需要開發(fā)人員編寫業(yè)務(wù)代碼手動(dòng)控制。
2)分庫(kù)分表
數(shù)據(jù)庫(kù)的外鍵約束只能控制一個(gè)數(shù)據(jù)庫(kù)實(shí)例,跨實(shí)例的情況下無(wú)法滿足。
最后
咱們面試?guó)喠⒅境蔀?nbsp;一款題庫(kù)全面、持續(xù)更新、題解優(yōu)質(zhì)的刷題神器,主要目的就是為了徹底解決所有你能想到的八股文學(xué)習(xí)痛點(diǎn)!
我們精選了近兩年的高頻面試真題,已經(jīng) 有近 5000 多道面試題 啦,由大廠資深面試官手寫答案,押題命中率超高!
不僅有傳統(tǒng)八股文,場(chǎng)景題、項(xiàng)目題、系統(tǒng)設(shè)計(jì)題等等應(yīng)有盡有,目前已經(jīng)有4000+道題,還在不斷更新中!
當(dāng)前早鳥福利!最低價(jià) 99.9 元買斷永久會(huì)員,正式運(yùn)營(yíng)價(jià)格為 399+。
小程序:
web 端:www.mianshiya.com
