【原創】數據庫中為什么不推薦使用外鍵約束

引言

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

【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。

但是呢,詢問他們原因,大多是這么回答的

每次做DELETE 或者UPDATE都必須考慮外鍵約束,會導致開發的時候很痛苦,測試數據極為不方便。

坦白說,這么說也是對的。但是呢,不夠全面,所以開一文來詳細說明。

正文

首先我們明確一點,外鍵約束是一種約束,這個約束的存在,會保證表間數據的關系“始終完整”。因此,外鍵約束的存在,并非全然沒有優點。
比如使用外鍵,可以

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

然而,魚和熊掌不可兼得。外鍵是能夠保證數據的完整性,但是會給系統帶來很多缺陷。正是因為這些缺陷,才導致我們不推薦使用外鍵,具體如下

性能問題

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

并發問題

在使用外鍵的情況下,每次修改數據都需要去另外一個表檢查數據,需要獲取額外的鎖。若是在高并發大流量事務場景,使用外鍵更容易造成死鎖。

擴展性問題

這里主要是分為兩點

  • 做平臺遷移方便,比如你從Mysql遷移到Oracle,像觸發器、外鍵這種東西,都可以利用框架本身的特性來實現,而不用依賴于數據庫本身的特性,做遷移更加方便。
  • 分庫分表方便,在水平拆分和分庫的情況下,外鍵是無法生效的。將數據間關系的維護,放入應用程序中,為將來的分庫分表省去很多的麻煩。

技術問題

使用外鍵,其實將應用程序應該執行的判斷邏輯轉移到了數據庫上。那么這意味著一點,數據庫的性能開銷變大了,那么這就對DBA的要求就更高了。很多中小型公司由于資金問題,并沒有聘用專業的DBA,因此他們會選擇不用外鍵,降低數據庫的消耗。
相反的,如果該約束邏輯在應用程序中,發現應用服務器性能不夠,可以加機器,做水平擴展。如果是在數據庫服務器上,數據庫服務器會成為性能瓶頸,做水平擴展比較困難。

轉載于:https://www.cnblogs.com/rjzheng/p/9907304.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388056.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388056.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初識Activiti

http://wenku.baidu.com/view/bb7364ad4693daef5ff73d32.html 1. 初識Activiti 1.1. 工作流與工作流引擎 工作流(workflow)就是工作流程的計算模型,即將工作流程中的工作如何前后組織在一起的邏輯和規則在計算機中以恰當的模型進行表示并對其…

開源軟件 安全風險_3開源安全風險及其解決方法

開源軟件 安全風險Open source software is very popular and makes up a significant portion of business applications. According to Synopsys, 99% of commercial databases contain at least one open source component, and nearly 75% of these codebases contain open…

React-Router 源碼分析1

1、單頁面應用的路由基本原理 demo1 router1.html 復制代碼以 hash 形式為例。 1、init 監聽瀏覽器 url hash 更新事件。 2、route 存儲路由更新時的回調到回調數組routes中,回調函數將負責對頁面的更新。 3、refresh 執行當前url對應的回調函數,更新頁面…

linux安裝日志切割程序

linux安裝日志切割程序 安裝 gcc(1) yum insatll gcc (2)# cd cronolog-1.6.2 4、運行安裝 # ./configure# make# make install 5、查看cronolog安裝后所在目錄(驗證安裝是否成功) # which cronolog 一般情…

自助分析_為什么自助服務分析真的不是一回事

自助分析That title probably got your attention and now you think I have some explaining to do! The key word in the title is the word “A”. Self-service analytics isn’t a thing if “a thing” means a single, distinct corporate initiative or set of require…

BPMN2.0-概要

BPMN2.0-概要 作者:AliKevin2011,發布于2012-6-27 一、BPMN簡介 BPMN(Business Process Model And Notation)- 業務流程模型和符號 是有BPMI(Business Process Management Initiative)開發的一套變準的業務…

如何用Phaser實現一個全家福拼圖H5

一、Phaser介紹 二、整體框架搭建 三、資源加載 四、游戲邏輯五、完成六、總結參考文檔 最近用Phaser做了一個全家福拼圖h5的項目,這篇文章將會從零開始講解如何用Phaser實現,最終效果如下: 源碼:https://github.com/ZENGzoe/phas…

angularjs 默認跳轉

angularjs 的 $state.go() 跳轉頁面 ,目標頁面的js函數 的執行 先于 $locationChangeStart 的監聽函數。 故意 添加 timeout 可以使 controller 在locationchangestart 之后觸發。轉載于:https://www.cnblogs.com/RoadAspenBK/p/9923332.html

錯誤錄入 算法_如何使用驗證錯誤率確定算法輸出之間的關系

錯誤錄入 算法Monument (www.monument.ai) enables you to quickly apply algorithms to data in a no-code interface. But, after you drag the algorithms onto data to generate predictions, you need to decide which algorithm or combination of algorithms is most re…

Activiti 簡易教程

一搭建環境 1.1 JDK 6 activiti 運行在版本 6以上的 JDK上。轉到 Oracle Java SE下載頁面,點擊按鈕“下載 JDK”。網頁中也有安裝說明。要核實安裝是否成功,在命令行上運行 java–version。將打印出安裝的 JDK的版本。 1.2 Ant 1.8.1 從 Ant[http://…

xargs命令詳解,xargs與管道的區別

在工作中經常會接觸到xargs命令,特別是在別人寫的腳本里面也經常會遇到,但是卻很容易與管道搞混淆,本篇會詳細講解到底什么是xargs命令,為什么要用xargs命令以及與管道的區別。為什么要用xargs呢,我們知道,…

pytorch回歸_PyTorch:用嶺回歸檢查泰坦尼克號下沉

pytorch回歸In this notebook, we shall use this dataset containing data about passengers from the Titanic. Based on this data, we will use a Ridge Regression model which just means a Logistic Regression model that uses L2 Regularization for predicting wheth…

Java后臺與VUE跨域交接

后臺代碼:package com.cn.Mr.Zhong.filter;import org.springframework.stereotype.Component;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;impor…

koa2 中使用 svg-captcha 生成驗證碼

1. 安裝svg-captcha $ npm install --save svg-captcha 2. 使用方法 生成有4個字符的圖片和字符串const svgCaptcha require(svg-captcha)const cap svgCaptcha.create({size: 4, // 驗證碼長度width:160,height:60,fontSize: 50,ignoreChars: 0oO1ilI, // 驗證碼字符中排除 …

Weblogic 節點啟動

1.啟動管理理節點export JAVA_OPTIONS"$JAVA_OPTIONS -Dcom.sun.xml.namespace.QName.useCompatibleSerialVersionUID1.0 -Djava.security.egdfile:/dev/./urandom"nohup ./startWebLogic.sh >admin.log &tail -f admin.log2.啟動節點ssonohup ./startManaged…

[Swift]LeetCode74. 搜索二維矩陣 | Search a 2D Matrix

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?微信公眾號:山青詠芝(shanqingyongzhi)?博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/)?GitHub地址&a…

iris數據集 測試集_IRIS數據集的探索性數據分析

iris數據集 測試集Let’s explore one of the simplest datasets, The IRIS Dataset which basically is a data about three species of a Flower type in form of its sepal length, sepal width, petal length, and petal width. The data set consists of 50 samples from …

Oracle 12c 安裝 Linuxx86_64

1)下載Oracle Database 12cRelease 1安裝介質 官方的下載地址: 1:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2:https://edelivery.oracle.com/EPD/Download/get_form?egroup_aru_number16496…

Linux入門實驗

學習Linux要先做實驗來熟悉操作系統本次先寫點入門的操作。 關于Linux入門實驗的操作如下: 【例1】顯示當前使用的shell [rootcentos7 ~]# echo ${SHELL} /bin/bash 【例2】顯示當前系統使用的所有shell [rootcentos7 ~]#cat /etc/shells /bin/sh /bin/bash /usr/bi…

flink 檢查點_Flink檢查點和恢復

flink 檢查點Apache Flink is a popular real-time data processing framework. It’s gaining more and more popularity thanks to its low-latency processing at extremely high throughput in a fault-tolerant manner.Apache Flink是一種流行的實時數據處理框架。 它以容…