<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          什么是數(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




          歡迎關(guān)注面試?guó)?/span>,每日獲取經(jīng)典面試題和優(yōu)質(zhì)題解,我們下期見(jiàn)~

          瀏覽 177
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一区二区三区四区在线 | 操碰在线视频 | 日韩黄片在线播放 | 国产尻屄视频 | 日本三级视频 |