mysql 范式化_MySQL-范式和反范式

1.第一范式(1NF)(列不能再拆分)

原子性,字段不可分(列的信息),只要是關系型數據庫,就自動滿足1NF;

2.第二范式(2NF)(主鍵唯一,且被依賴)

在第一范式基礎上建立的,即滿足第二范式的必須先滿足第一范式。要求DB表中的每個實例或行必須可以被唯一區分,通常設計一個主鍵來實現,其他屬性完全依賴主鍵。

3.第三范式(3NF)(表與其他表間沒有關聯)

必須滿足第二范式,要求一個數據庫表中不包含已在其他表中已包含的非主鍵字段。即:表的信息,如果能夠被推導出來,就不應該單獨設計一個字段來存放(能盡量外鍵join就用外鍵join)。很多時候,為滿足第三范式往往會把一張表分成多張表,如:

c1e9148a29265ae838229e48e72ab9f9.png

4.反范式

通過增加冗余或重復的數據來提高數據庫的讀性能。

具體做法:在概念數據模型設計時遵守第三范式,降低范式標準的工作放到物理數據模型設計時考慮。降低范式就是增加字段,減少了查詢時的關聯,提高查詢效率,因為在數據庫的操作中查詢的比例要遠遠大于DML的比例。但是反范式化一定要適度,并且在原本已滿足三范式的基礎上再做調整。

實際,比如:可以減少關聯查詢時,jion表的次數,如:在3中,增加字段role_name。

5.范式化優點及缺點:

優點:

.更新操作通常比反范式化要快;

.范式化的表通常更小,沒有數據冗余,更省數據庫空間,同時可以放在內存,所以執行操作會更快。

.很少有多余數據意味著檢索列表數據更少需要distinct或group by語句。

.數據較好的范式化,只有很少或沒有重復數據,所以,只需要修改更少的數據。

缺點:

.范式化schema通常需要關聯,可能使一些索引策略無效。

.范式等級越高,設計出來的表越多,可能會增加查詢需要的時間。

6.反范式化優點及缺點:

優點:

.可以很好避免關聯。

.如果不需要關聯表,對大部分查詢最差情況,沒有使用索引,全表掃描,當數據比內存大時,可能比關聯快,避免隨機IO

7.實際經驗

實際中,不會極端使用范式化或反范式化schema,可能使用部分范式化schema、緩存表、及其他技巧。

最常見反范式化數據方法:復制或緩存,在不同表中存儲相同的特定列,比如:實際業務涉及的表非常多,表間連接會比較多,對表的操作要盡量快,通常會使用反范式設計,用空間換時間,把數據冗余在多張表中,查詢時可以減少或避免表間關聯。

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

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

相關文章

端口被占用解決辦法

1. 端口被占用解決辦法 netstat -ano | findstr 8080(端口號) taskkill -pid (進程pid) –f轉載于:https://www.cnblogs.com/xaoco/p/9114773.html

java 判斷是否是list_JAVA從頭開始一基礎梳理(4-3)

大家好,今天我們介紹一下java中常用的集合類型。首先,我們先看一下java中集合類型的結構。以上是集合的繼承關系圖,通常我們使用的比較多的是 Set , List , Map以及其衍生的子類和接口實現類。首先給大家介紹一下List,List本身是一…

Python2.x還是3.x?

2.x 和 3.x對于程序員的編碼來說,沒有發生太大的變化,當然也是有變化的,主要是Python內部發生了巨變。 要用3.x的原因是: 1、3.x和2.x版本不兼容。 2、Python庫新增的內容不支持2.x了。 3、2.x版本官方支持到2020年結束。 晚改…

前端網頁廣告無線翻滾_從小白到web前端工程師進階之路 從0到1到更深

互聯網的發展,讓web前端技術發生了翻天覆地的變化,前端開發工程師可以讓網頁內容變得更加生動,為用戶帶來更好的體驗。那么,武漢web前端培訓哪個好?web前端好學嗎?作為一個合格的Web前端工程師,…

PowerDesigner導出表為Excel(轉)

打開腳本運行器CtrlShiftX 導出: ****************************************************************************** Option ExplicitDim rowsNumrowsNum 0 -----------------------------------------------------------------------------Main function -------…

判讀一個對象不為空_ArrayList實現分析(一)——對象創建

ArrayList是java中最常用的集合類之一,它的內部實現是基于數組,因此ArryList可以根據索引實現隨機訪問。ArryList繼承了AbstractList類,并且實現了List, RandomAccess, Cloneable接口。下面詳細分析一下ArrayList的實現,下面的分析…

AngularJS與Angular的區別

指同一事物,版本的區別,叫法不同 Angular2.0之前的版本(1.x)叫做AngularJS 1.x的使用是引入AngularJS的js文件到網頁。 2.0之后,就是完全不同了。 Angular2.x與Angular1.x 的區別類似 Java 和 JavaScript 或者說是…

網頁控制臺調用click()失敗_C# 調用百度AI 人臉識別

一、設置登錄百度云控制臺,添加應用-添加人臉識別,查找,對比等。設置人臉識別應用記住API Key和Secret Key二、創建Demo程序1、使用Nuget安裝 Baidu.AI 和 Newtonsoft.JsonNuget2、直接下載SDK https://ai.baidu.com/file/7D961BC013AB4AA790…

mysql查看服務器CPU和內存_怎么查看服務器的cpu和內存的硬件信息

可以按照如下方式進行操作:一、查看cpu總個數方法:1、首先執行top命令,如下圖中內容所表示。2、在top命令的顯示界面,按數字鍵1,即可查看到當前系統中的總cpu數,如下圖中內容所表示。二、查看總內存的方法&…

內核模式下的文件操作

內核模式下的文件操作 轉載于:https://www.cnblogs.com/endenvor/p/9119495.html

極光推送指定用戶推送_干貨|SpringBoot集成極光推送完整實現代碼(建議收藏)...

工作中經常會遇到服務器向App推送消息的需求,一般企業中選擇用極光推送的比較多,在集成極光時發現極光的文檔并不完整,網上的文章也很多不能直接使用,這里列出我在工作中集成極光的全部代碼,只需要按照如下代碼保證一次…

什么是ES6?

什么是ES6? ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式發布了。Mozilla公司將在這個標準的基礎上,推出JavaScript 2.0。   ECMAScript和JavaScript到底是什么關系?很多…

Babylon-AST初探-代碼更新刪除(Update Remove)

通過前兩篇文章的介紹,大家已經了解了Create和Retrieve,我們接著介紹Update和 Remove操作。Update操作通常配合Create來完成。我們這篇文章主要介紹幾個常用的NodePathAPI:replace、insert、remove。具體也可以看babel-handbook中的Manipulat…

python中時間間隔默認單位是什么_Python時間增量(以年為單位)

你需要不止一個timedelta來說明多少年過去了;你還需要知道開始(或結束)日期。(這是閏年的事。)最好的方法是使用dateutil.relativedeltaobject,但這是第三方模塊。如果您想知道從某個日期起的datetime年(默認為現在),可以執行以下操作&#x…

編解碼異常分析

前言 最近在做的項目,有H264解碼的需求。部分H264文件解碼播放后,顯示為綠屏或者花屏。 分析 如何確認是否是高通硬解碼的問題 adb 指令 adb root adb remount adb shell setenforce 0 adb shell setprop vendor.gralloc.disable_ubwc 1 adb shell c…

python讀取數據庫導出文件_python如何導出excel表格數據庫數據

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云數據庫專家保駕護航,為用戶…

mysql堆溢出_為什么這個MySQL觸發器會導致堆棧溢出?

我今天遇到了同樣的問題,每次觸發都會導致堆棧溢出.原來我的Zend社區服務器安裝附帶了一個默認的my.cnf文件,其中thread_stack大小設置為128K,這導致每個線程中可用于堆棧的131072字節:mysql> show variables where Variable_name thread_stack;---------------…

MySQL定義數據庫對象之指定definer

mysql創建view、trigger、function、procedure、event時都會定義一個Definer: SQL SECURITY 有兩個選項,一個為DEFINER,一個為INVOKER;SQL SECURITY { DEFINER | INVOKER } :指明誰有權限來執行。DEFINER 表示按定義者擁有的權限來…

js根據name獲取value_js 函數的重載

js 函數的重載我們知道,很多編程語言都有函數的重載。所謂的重載,看定義:重載,簡單說,就是函數或者方法有相同的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間&#xff…

python調用菜單響應事件_[Python] wxpython 編程觸發菜單或按鈕事件

最近逐步熟悉wxpython,編寫了幾個小小功能的GUI程序,GUI中免不了會有在代碼中觸發控件事件的業務需求。在其他Gui界面的語言中有postevent、triggerevent 調用事件名稱的函數,非常方便。在wxpython里如何解決呢,上一段簡單的代碼。…