MySQL學習Day24—數據庫的設計規范

一、數據庫設計的重要性:

1.糟糕的數據庫設計產生的問題:

(1)數據冗余、信息重復、存儲空間浪費

(2)數據更新、插入、刪除的異常

(3)無法正確表示信息

(4)丟失有效信息

(5)程序性能差

2.良好的數據庫設計有以下優點:

(1)節省數據的存儲空間

(2)能夠保證數據的完整性

(3)方便進行數據庫應用系統的開發

二、范式

1.范式簡介:

在關系型數據庫中,關于數據表設計的基本原則、規則稱為范式,可以理解為一張數據表的設計結構需要滿足的某種設計標準的級別。范式時關系型數據庫理論的基礎,時在設計數據庫結構中所要遵循的規則和指導方法。

2.范式的種類:

按照范式級別,范式從低到高分別是:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯—科德范式(BCNF),第四范式(4NF)和第五范式(5NF)。數據庫的范式設計越高階,冗余度就越低,同時高階的范式一定符合低階范式的要求,滿足最低要求的范式是第一范式,在第一范式的基礎上進一步滿足更多規范要求的稱為第二范式,其余范式以此類推。一般來說在關系型數據庫的設計中最高要達到BCNF,普遍還是3NF。有時為了提高查詢性能還要破壞范式化。

3.鍵和相關屬性概念:

(1)超鍵:能夠唯一標識元組的屬性集稱為超鍵

(2)候選鍵:如果超鍵不包括多余的屬性,那么這個超鍵就是候選鍵

(3)主鍵:從候選鍵中選擇一個作為主鍵

(4)外鍵:如果數據表R1中的某屬性集不是R1的主鍵,而是另一個數據表R2的主鍵,那么這個屬性集就是數據表R1的外鍵

(5)主屬性:包含在任一候選鍵中的屬性

(6)非主屬性:不包含在任一候選鍵中的屬性。

4.第一范式(1st NF):第一范式主要是確保數據表中的每個字段的值必須具有原子性,也就是說數據表中的每個字段的值為不可拆分的最小單元。

5.第二范式(2NF):在滿足第一范式的基礎上,還要滿足數據表中的每一條記錄都是唯一可以標識的,而且所有的非主鍵字段都必須完全依賴于主鍵,不能只依賴主鍵的一部分。也就是如果知道主鍵的所有屬性的值,就可以檢索到任何元組的任何屬性的任何值。2NF要求實體的屬性集完全依賴于主關鍵字,如果不存在完全依賴,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體和原實體之間是一對多的關系。

6.第三范式(3NF):在滿足第二范式的基礎上確保數據表中的每一個非主鍵字段都和主鍵字段直接相關,也就是說要求數據表中的所有非主鍵字段不能依賴于其他非主鍵字段。也就是說所有非主鍵屬性之間必須相互獨立。

第一范式確保每列的原子性,數據庫的每一項都是不可分割的原子數據項,不可再分的最小數據單元,而不能是集合、數組、記錄等非原子數據項。第二范式確保每列都和主鍵完全依賴,尤其在復合主鍵的情況下,非主鍵部分不應該依賴于部分主鍵。第三范式確保每列都和主鍵列直接相關,而不是間接相關。

7.巴斯范式(BCNF):BCNF被稱為是修正的第三范式或擴充的第三范式,若一個第三范式只有一個候選鍵并且它的每個候選鍵都是單屬性,那么該關系自然到達BCNF。

8.第四范式:第四范式是在BCNF的基礎上消除非平凡且非函數依賴的多值依賴(即把同一表內的多對多關系刪除)

多值依賴:屬性之間的一對多關系,記為k→→A。

函數依賴:實際上是單值依賴,不能表達屬性值之間的一對多關系

平凡的多值依賴:全集U=K+A,一個K可以對應多個A,即k→→A,此時整個表就是一組一對多關系

非平凡的多值依賴:全集U=K+A+B,一個K可以對應于多個A,也可以對應于多個B,A與B互相獨立

范式的優點:數據的標準化有助于消除數據庫中的數據冗余,3NF被認為在性能、擴展性和數據完整性方面達到了最好的平衡。

范式的缺點:范式可能降低查詢的效率,因為范式等級越高,設計出的數據表越多、越精細、數據冗余度就越低,進行數據查詢的時候就可能需要關聯多張表,也可能導致索引失效。

三、反范式化:

1.概述:

有的時候不能簡單按照規范要求設計數據表,因為有的數據看似冗余,其實對業務來說十分重要。這個時候,就要遵循業務優先的原則,首先滿足業務需求,再盡量減少冗余。如果數據庫中的數據量比較大,系統的UV和PV訪問頻次比較高,則完全按照MySQL的三大范式設計數據表,讀數據時會產生大量的關聯查詢,在一定程度上會影響數據庫的讀性能。如果想對查詢效率進行優化,反范式優化也是一種優化思路。此時可以通過在數據表中增加冗余字段來提高數據庫的讀性能。

2.反范式化帶來的問題:

(1)存儲空間變大

(2)一個表中的字段做了修改,另一個表中的冗余字段也需要同步修改,否則數據不一致

(3)若采用存儲過程來支持數據的更新、刪除等額外操作,如果頻繁更新會非常消耗系統資源

(4)在數據量小的情況下反范式化可能會讓數據庫設計更加復雜

3.反范式化應用場景:

(1)增加冗余字段的建議:這個冗余字段不需要經常修改或者查詢時不可或缺

(2)歷史快照、歷史數據的需要

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

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

相關文章

力扣138.隨機鏈表的復制

給你一個長度為 n 的鏈表,每個節點包含一個額外增加的隨機指針 random ,該指針可以指向鏈表中的任何節點或空節點。 構造這個鏈表的 深拷貝。 深拷貝應該正好由 n 個 全新 節點組成,其中每個新節點的值都設為其對應的原節點的值。新節點的 n…

編寫一個自動合并代碼到不同分支的腳本小工具

新建一個 autoMerge.sh 的文件,文件內容如下 # 提示用戶確認繼續執行 read -p "確認要執行腳本嗎?(輸入 yes 繼續): " userInput# 檢查用戶輸入是否為 "yes" if [ "$userInput" ! "yes" ]; thenecho "用戶…

《TCP/IP詳解 卷一》第9章 廣播和組播

目錄 9.1 引言 9.2 廣播 9.2.1 使用廣播地址 9.2.2 發送廣播數據報 9.3 組播 9.3.1 將組播IP地址轉換為組播MAC地址 9.3.2 例子 9.3.3 發送組播數據報 9.3.4 接收組播數據報 9.3.5 主機地址過濾 9.4 IGMP協議和MLD協議 9.4.1 組成員的IGMP和MLD處理 9.4.2 組播路由…

可用于智能客服的完全開源免費商用的知識庫項目

介紹 FastWiki項目是一個高性能、基于最新技術棧的知識庫系統,專為大規模信息檢索和智能搜索設計。利用微軟Semantic Kernel進行深度學習和自然語言處理,結合.NET 8和MasaBlazor前端框架,后臺采用.NET 8MasaFrameworkSemanticKernel&#xff…

嵌入式Linux學習DAY26

管道的作用:進程間的通信 無名管道: 只能在父子進程中進行通信 pipe int pipe(int pipefd[2]); 功能: 創建一個無名管道 參數: pipefd[0]:讀管道文件描述符 pipefd[1]:寫管道文件描述符 …

【InternLM 實戰營筆記】基于 InternLM 和 LangChain 搭建MindSpore知識庫

InternLM 模型部署 準備環境 拷貝環境 /root/share/install_conda_env_internlm_base.sh InternLM激活環境 conda activate InternLM安裝依賴 # 升級pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install str…

【大廠AI課學習筆記NO.53】2.3深度學習開發任務實例(6)數據采集

這個系列寫了53期了,很多朋友收藏,看來還是覺得有用。 后續我會把相關的內容,再次整理,做成一個人工智能專輯。 今天學習到了數據采集的環節。 這里有個問題,數據準備包括什么,還記得嗎? 數…

ZStack Cube超融合入選IDC《中國超融合基礎架構市場評估》報告

近日,IDC發布了《中國超融合基礎架構市場評估,2023》。IDC針對中國超融合基礎架構市場的發展現狀展開了調研,明確了最終用戶構建融合型云平臺的痛點和難點,闡述了市場中各技術服務提供商的服務方案和優勢,并對未來中國…

vue3+ts+vite數據大屏自適應總結(兩種方法)

總結一下我常用的數據大屏自適應方法 目錄 1、通過css縮放方案: 利用transform:scale 進行適配2、采用rem布局, 根據屏幕分辨率大小不同,調整根元素html的font-size, 從而達到每個元素寬高自動變化,適配不…

接口測試實戰--mock測試、日志模塊

一、mock測試 在前后端分離項目中,當后端工程師還沒有完成接口開發的時候,前端開發工程師利用Mock技術,自己用mock技術先調用一個虛擬的接口,模擬接口返回的數據,來完成前端頁面的開發。 接口測試和前端開發有一個共同點,就是都需要用到后端工程師提供的接口。所以,當…

Redis速學

一、介紹Redis 基本概念和特點 Redis是一個開源的內存數據庫,它主要用于數據緩存和持久化。其數據存儲在內存中,這使得它具有非常快的讀寫速度。Redis支持多種數據結構,包括字符串、哈希、列表、集合和有序集合,這使得它非常靈活…

書生·浦語大模型圖文對話Demo搭建

前言 本節我們先來搭建幾個Demo來感受一下書生浦語大模型 InternLM-Chat-7B 智能對話 Demo 我們將使用 InternStudio 中的 A100(1/4) 機器和 InternLM-Chat-7B 模型部署一個智能對話 Demo 環境準備 在 InternStudio 平臺中選擇 A100(1/4) 的配置,如下圖所示鏡像…

微店商品詳情 API 支持哪些商品信息的獲取?

微店(Weidian)并沒有一個公開的、官方維護的API文檔來供開發者使用。這意味著,如果你想要獲取微店商品詳情或其他相關信息,你通常需要通過微店官方提供的方式來實現,例如使用其開放平臺、官方SDK或聯系微店的技術支持獲…

Spring常見面試題知識點總結(三)

7. Spring MVC: MVC架構的概念。 MVC(Model-View-Controller)是一種軟件設計模式,旨在將應用程序分為三個主要組成部分,以實現更好的代碼組織、可維護性和可擴展性。每個組件有著不同的職責,相互之間解耦…

11.Prometheus常見PromeQL表達式

平凡也就兩個字: 懶和惰; 成功也就兩個字: 苦和勤; 優秀也就兩個字: 你和我。 跟著我從0學習JAVA、spring全家桶和linux運維等知識,帶你從懵懂少年走向人生巔峰,迎娶白富美! 關注微信公眾號【 IT特靠譜 】,每天都會分享技術心得~ …

YOLO算法

YOLO介紹 YOLO,全稱為You Only Look Once: Unified, Real-Time Object Detection,是一種實時目標檢測算法。目標檢測是計算機視覺領域的一個重要任務,它不僅需要識別圖像中的物體類別,還需要確定它們的位置。與分類任務只關注對…

【矩陣】【方向】【素數】3044 出現頻率最高的素數

作者推薦 動態規劃的時間復雜度優化 本文涉及知識點 素數 矩陣 方向 LeetCode 3044 出現頻率最高的素數 給你一個大小為 m x n 、下標從 0 開始的二維矩陣 mat 。在每個單元格,你可以按以下方式生成數字: 最多有 8 條路徑可以選擇:東&am…

安裝 Ubuntu 22.04.3 和 docker

文章目錄 一、安裝 Ubuntu 22.04.31. 簡介2. 下載地址3. 系統安裝4. 系統配置 二、安裝 Docker1. 安裝 docker2. 安裝 docker compose3. 配置 docker 一、安裝 Ubuntu 22.04.3 1. 簡介 Ubuntu 22.04.3 是Linux操作系統的一個版本。LTS 版本支持周期到2032年。 系統要求雙核 C…

C++的模板template

一、什么是模板 C中的模板分為類模板和函數模板,并不是一個實際的類或函數,這指的是編譯器不會自動為其生成具體的可執行代碼。只有在具體執行時,編譯器才幫助其實例化。 二、為什么引入模板 拿我們最常見的交換函數來舉例子,如果…

代碼隨想錄 二叉樹第二周

目錄 101.對稱二叉樹 100.相同的樹 572.另一棵樹的子樹 104.二叉樹的最大深度 559.N叉樹的最大深度 111.二叉樹的最小深度 222.完全二叉樹的節點個數 110.平衡二叉樹 257.二叉樹的所有路徑 101.對稱二叉樹 101. 對稱二叉樹 已解答 簡單 相關標簽 相關企業 給你一…