偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

數(shù)據(jù)庫(kù)中為什么不推薦使用外鍵約束

數(shù)據(jù)庫(kù)
首先我們明確一點(diǎn),外鍵約束是一種約束,這個(gè)約束的存在,會(huì)保證表間數(shù)據(jù)的關(guān)系“始終完整”。因此,外鍵約束的存在,并非全然沒有優(yōu)點(diǎn)。

 引言

其實(shí)這個(gè)話題是老生常談,很多人在工作中確實(shí)也不會(huì)使用外鍵。包括在阿里的JAVA規(guī)范中也有下面這一條

【強(qiáng)制】不得使用外鍵與級(jí)聯(lián),一切外鍵概念必須在應(yīng)用層解決。

但是呢,詢問(wèn)他們?cè)?,大多是這么回答的

每次做DELETE 或者UPDATE都必須考慮外鍵約束,會(huì)導(dǎo)致開發(fā)的時(shí)候很痛苦,測(cè)試數(shù)據(jù)極為不方便。

坦白說(shuō),這么說(shuō)也是對(duì)的。但是呢,不夠全面,所以開一文來(lái)詳細(xì)說(shuō)明。

正文

首先我們明確一點(diǎn),外鍵約束是一種約束,這個(gè)約束的存在,會(huì)保證表間數(shù)據(jù)的關(guān)系“始終完整”。因此,外鍵約束的存在,并非全然沒有優(yōu)點(diǎn)。

比如使用外鍵,可以

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

然而,魚和熊掌不可兼得。外鍵是能夠保證數(shù)據(jù)的完整性,但是會(huì)給系統(tǒng)帶來(lái)很多缺陷。正是因?yàn)檫@些缺陷,才導(dǎo)致我們不推薦使用外鍵,具體如下:

性能問(wèn)題

假設(shè)一張表名為user_tb。那么這張表里有兩個(gè)外鍵字段,指向兩張表。那么,每次往user_tb表里插入數(shù)據(jù),就必須往兩個(gè)外鍵對(duì)應(yīng)的表里查詢是否有對(duì)應(yīng)數(shù)據(jù)。如果交由程序控制,這種查詢過(guò)程就可以控制在我們手里,可以省略一些不必要的查詢過(guò)程。但是如果由數(shù)據(jù)庫(kù)控制,則是必須要去這兩張表里判斷。

并發(fā)問(wèn)題

在使用外鍵的情況下,每次修改數(shù)據(jù)都需要去另外一個(gè)表檢查數(shù)據(jù),需要獲取額外的鎖。若是在高并發(fā)大流量事務(wù)場(chǎng)景,使用外鍵更容易造成死鎖。

擴(kuò)展性問(wèn)題

這里主要是分為兩點(diǎn)

  •  做平臺(tái)遷移方便,比如你從Mysql遷移到Oracle,像觸發(fā)器、外鍵這種東西,都可以利用框架本身的特性來(lái)實(shí)現(xiàn),而不用依賴于數(shù)據(jù)庫(kù)本身的特性,做遷移更加方便。
  •  分庫(kù)分表方便,在水平拆分和分庫(kù)的情況下,外鍵是無(wú)法生效的。將數(shù)據(jù)間關(guān)系的維護(hù),放入應(yīng)用程序中,為將來(lái)的分庫(kù)分表省去很多的麻煩。

技術(shù)問(wèn)題

使用外鍵,其實(shí)將應(yīng)用程序應(yīng)該執(zhí)行的判斷邏輯轉(zhuǎn)移到了數(shù)據(jù)庫(kù)上。那么這意味著一點(diǎn),數(shù)據(jù)庫(kù)的性能開銷變大了,那么這就對(duì)DBA的要求就更高了。很多中小型公司由于資金問(wèn)題,并沒有聘用專業(yè)的DBA,因此他們會(huì)選擇不用外鍵,降低數(shù)據(jù)庫(kù)的消耗。

相反的,如果該約束邏輯在應(yīng)用程序中,發(fā)現(xiàn)應(yīng)用服務(wù)器性能不夠,可以加機(jī)器,做水平擴(kuò)展。如果是在數(shù)據(jù)庫(kù)服務(wù)器上,數(shù)據(jù)庫(kù)服務(wù)器會(huì)成為性能瓶頸,做水平擴(kuò)展比較困難。

責(zé)任編輯:龐桂玉 來(lái)源: 數(shù)據(jù)庫(kù)開發(fā)
相關(guān)推薦

2020-06-09 09:19:14

數(shù)據(jù)庫(kù)

2010-01-05 09:24:42

MySQL外鍵約束

2019-11-05 08:20:13

MySQL數(shù)據(jù)庫(kù)外鍵

2023-11-06 13:04:59

Python日志庫(kù)

2024-11-29 08:20:22

Autowired場(chǎng)景項(xiàng)目

2010-06-17 17:50:31

SQL Server外

2010-10-09 10:29:29

MySQL外鍵

2024-06-04 00:10:00

開發(fā)拷貝

2024-11-12 10:30:54

Docker部署數(shù)據(jù)庫(kù)

2022-05-18 16:55:38

數(shù)據(jù)分析工具開源

2023-09-08 08:44:09

Oracle數(shù)據(jù)庫(kù)

2024-09-12 08:32:42

2011-08-03 17:43:53

MySQL數(shù)據(jù)庫(kù)外鍵約束

2025-05-16 02:00:00

HashMapJava代碼

2010-05-17 16:10:39

MySQL數(shù)據(jù)庫(kù)

2021-08-23 13:02:50

MySQLJOIN數(shù)據(jù)庫(kù)

2025-10-17 01:25:00

SpringIDEA@Autowired

2011-09-01 10:56:34

2021-02-18 09:23:47

數(shù)據(jù)庫(kù)分區(qū)數(shù)據(jù)庫(kù)倉(cāng)庫(kù)

2022-01-11 10:29:32

Docker文件掛載
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)