欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql關(guān)于數(shù)據(jù)庫是否應(yīng)該使用外鍵約束詳解說明

 更新時間:2021年10月22日 10:43:56   作者:曲鳥  
MySQL 外鍵約束(FOREIGN KEY)是表的一個特殊字段,經(jīng)常與主鍵約束一起使用。對于兩個具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中主鍵所在的表就是主表,外鍵所在的表就是從表。外鍵用來建立主表與從表的關(guān)聯(lián)關(guān)系,為兩個表的數(shù)據(jù)建立連接,約束兩個表中數(shù)據(jù)的一致性和完整性

一、前言

對于【是否使用外鍵約束】這個話題已經(jīng)是老生常談的了。在學(xué)校中,老師交給我們的大多是需要我們建立外鍵約束,但進(jìn)入了實(shí)際工作很多時候并不會使用外鍵,而是通過代碼邏輯來控制。包括在阿里的JAVA規(guī)范中也明確規(guī)定:【強(qiáng)制】不得使用外鍵與級聯(lián),一切外鍵概念必須在應(yīng)用層解決。

為什么要做這樣的規(guī)定呢?到底該不該使用外鍵約束呢?我們可以舉一個例子來說明

二、舉例說明

現(xiàn)在我們在數(shù)據(jù)庫中建立了兩張表:【product和project】,【project】的porduct字段,關(guān)聯(lián)Product,他們之間存在下圖這樣的一條外鍵記錄:

在這里插入圖片描述

當(dāng)我們對【project】表增加一條project_id為 1 的記錄的時候,由于【product】表不存在相應(yīng)的記錄會導(dǎo)致報錯:

在這里插入圖片描述

可以看出,這個約束的存在,會保證表間數(shù)據(jù)的關(guān)系的完整性。更不容易出現(xiàn)臟數(shù)據(jù)。這是外鍵約束非常明顯的優(yōu)點(diǎn)!

總結(jié)一下,外鍵約束具有如下的優(yōu)點(diǎn):

  • 保證數(shù)據(jù)的完整性和一致性
  • 級聯(lián)操作方便
  • 將數(shù)據(jù)完整性判斷托付給了數(shù)據(jù)庫完成,減少了程序的代碼量

但也存在著不可忽略的缺點(diǎn):

性能問題

我們剛建立了兩張表【project】和【product】,【project】表通過project_id字段與【product】表做了外鍵約束。

這個時候,當(dāng)我們每次往【project】表插入數(shù)據(jù)的時候,它會先去【product】中查詢是否有對應(yīng)的關(guān)聯(lián)數(shù)據(jù),如果通過程序來控制可以不進(jìn)行這次查詢。但設(shè)立了外鍵約束,就一定會去進(jìn)行該查詢。這實(shí)際是冗余的。當(dāng)關(guān)聯(lián)的字段少的時候可能沒啥影響,但一但關(guān)聯(lián)字段多了后,這種影響就尤其明顯!

死鎖

外鍵導(dǎo)致查詢需要依賴其他數(shù)據(jù)表,這意味著 InnoDB 需要在父級表(或相關(guān)表)中檢驗相應(yīng)的值。這也會鎖定父級表的數(shù)據(jù)行,以保證在事務(wù)完成前該行不會被刪除。這會導(dǎo)致意外的鎖等待,甚至是死鎖,這類問題很難被定位。

分庫分表困難

加了約束的數(shù)據(jù)庫在需要分庫分表的情況下,會特別困難

開發(fā)/測試效率的降低

在我們?nèi)粘5臏y試過程中,經(jīng)常會遇到發(fā)現(xiàn)了一個BUG想復(fù)現(xiàn)或者方便測試的情況,會直接改數(shù)據(jù)庫表的數(shù)據(jù)來達(dá)到方便測試的效果。

雖然這及不規(guī)范,但實(shí)際情況就是能夠提升我們很多效率。這是毋庸置疑的!可是,這樣的操作也會帶來一些問題,比如因為數(shù)據(jù)導(dǎo)致的BUG,但實(shí)際并不是程序的BUG,或者發(fā)現(xiàn)不了一些潛在的BUG。

三、總結(jié)

目前很多互聯(lián)網(wǎng)公司,特別是大廠對于外鍵的態(tài)度都是要求禁用。這其實(shí)不單單因為性能問題,主要也因為互聯(lián)網(wǎng)的業(yè)務(wù)變化快,會間接導(dǎo)致表結(jié)構(gòu)容易發(fā)生變動,很可能會因為外鍵約束的存在導(dǎo)致導(dǎo)意想不到的問題和開發(fā)效率的降低。因此,在非必要的情況、不需要高可靠性的業(yè)務(wù)場景下,不建議使用外鍵約束,這樣更能夠擁抱變化。
但我們并不能一桿子打死,因為有的業(yè)務(wù)場景反而使用外鍵約束更好,比如政務(wù)、銀行、軍工等需要數(shù)據(jù)高可靠的情況下。所以我的建議是:如果是業(yè)務(wù)相對復(fù)雜的話,可以在測試環(huán)境使用外鍵約束,但上了生產(chǎn)環(huán)境需要去掉。如果業(yè)務(wù)相對簡單,那完全可以刪除外鍵約束。但對于銀行、軍工行業(yè)這些不允許數(shù)據(jù)出錯,需要高可靠性的場景下,還是建議建立外鍵約束。

到此這篇關(guān)于Mysql關(guān)于數(shù)據(jù)庫是否應(yīng)該使用外鍵約束詳解說明的文章就介紹到這了,更多相關(guān)Mysql 數(shù)據(jù)庫外鍵約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL復(fù)制表結(jié)構(gòu)和內(nèi)容到另一張表中的SQL語句

    MySQL復(fù)制表結(jié)構(gòu)和內(nèi)容到另一張表中的SQL語句

    這篇文章主要介紹了MySQL復(fù)制表結(jié)構(gòu)和內(nèi)容到另一張表中的SQL語句,需要的朋友可以參考下
    2014-07-07
  • 從mysql讀寫分離著手提升服務(wù)器性能

    從mysql讀寫分離著手提升服務(wù)器性能

    這篇文章主要為大家介紹了從mysql讀寫分離著手提升服務(wù)器性能實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • MySQL優(yōu)化之如何寫出高質(zhì)量sql語句

    MySQL優(yōu)化之如何寫出高質(zhì)量sql語句

    在數(shù)據(jù)庫日常維護(hù)中,最常做的事情就是SQL語句優(yōu)化,因為這個才是影響性能的最主要因素。這篇文章主要給大家介紹了關(guān)于MySQL優(yōu)化之如何寫出高質(zhì)量sql語句的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • MySQL連接異常報10061錯誤問題解決

    MySQL連接異常報10061錯誤問題解決

    這篇文章主要介紹了MySQL連接異常報10061錯誤問題解決,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • MySQL性能優(yōu)化之分區(qū)表的使用詳解

    MySQL性能優(yōu)化之分區(qū)表的使用詳解

    在當(dāng)今數(shù)據(jù)驅(qū)動的時代,大型數(shù)據(jù)庫的性能優(yōu)化對于企業(yè)的成功至關(guān)重要,本文將深入探討MySQL分區(qū)表的基礎(chǔ)知識、性能優(yōu)勢、分區(qū)策略的選擇和實(shí)施等內(nèi)容,感興趣的小伙伴可以了解一下
    2023-06-06
  • MySQL使用集合函數(shù)進(jìn)行查詢操作實(shí)例詳解

    MySQL使用集合函數(shù)進(jìn)行查詢操作實(shí)例詳解

    這篇文章主要介紹了MySQL使用集合函數(shù)進(jìn)行查詢操作,結(jié)合實(shí)例形式詳細(xì)分析了MySQL使用集合函數(shù)進(jìn)行的運(yùn)算與查詢操作使用技巧,需要的朋友可以參考下
    2018-06-06
  • mysql datetime查詢異常問題解決

    mysql datetime查詢異常問題解決

    這篇文章主要介紹了mysql datetime查詢異常問題解決的相關(guān)資料,這里對異常進(jìn)行了詳細(xì)的介紹和該如何解決,需要的朋友可以參考下
    2016-11-11
  • CentOS 6、7下mysql 5.7 詳細(xì)安裝教程

    CentOS 6、7下mysql 5.7 詳細(xì)安裝教程

    這篇文章主要為大家介紹了CentOS 6、7下mysql 5.7 詳細(xì)安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • mysql主從復(fù)制讀寫分離的配置方法詳解

    mysql主從復(fù)制讀寫分離的配置方法詳解

    一般來說mysql都是通過 主從復(fù)制(Master-Slave)的方式來同步數(shù)據(jù),再通過讀寫分離(MySQL-Proxy)來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力 這樣的方案來進(jìn)行部署與實(shí)施的。
    2018-04-04
  • Mysql中的innoDB如何解決幻讀

    Mysql中的innoDB如何解決幻讀

    這篇文章主要介紹了Mysql中的innoDB如何解決幻讀,幻讀是指在同一個事務(wù)中,前后兩次查詢相同范圍的時候得到的結(jié)果不一致,文章將介紹InnoDB引入間隙鎖和next-key?lock機(jī)制去解決幻讀問題,感興趣的小伙伴可以參考一下
    2022-04-04

最新評論