數據庫基礎概念與范式反范式總結

文章目錄

  • 一、基本概念
    • 1、屬性
    • 2、元組
    • 3、關系
    • 4、超鍵
    • 5、候選鍵
    • 6、主鍵
    • 7、主屬性
    • 8、外鍵
    • 9、函數依賴
    • 完全依賴
  • 二、數據庫范式
    • 1、第一范式(1NF)
    • 2、第二范式(2NF)
    • 3、第三范式(3NF)
    • 4、巴斯-科德范式(BCNF)
    • 5、第四范式(4NF)
    • 6、第五范式(5NF)
  • 三、反范式
  • 四、總結

一、基本概念

我們通過下面這個學生表來深入理解下,假設姓名沒有重名的

學生表:姓名,性別,年齡,是否成年,身份證號碼,手機號碼,學號,班級,學生所在班級中的座位號,班主任

1、屬性

屬性就是字段,我們表中的每一列

2、元組

元組就是表中的每行數據(即數據庫表中的每條記錄),在二維表里,元組也稱為行。

3、關系

關系(Relation)是指一個表(Table),它由行(Rows)和列(Columns)組成。

4、超鍵

超鍵,又叫超碼,是能夠唯一標識關系中的每個元組的一個或多個屬性的集合,也就是在關系中能唯一標識記錄的屬性集。

超鍵可以包含多個屬性,但不一定是最小的,超鍵+任何屬性=超鍵

超鍵的分類:

  • 單屬性:表中的某個屬性
  • 組合:由多個屬性組成
  • 唯一性約束超鍵:通過在屬性上添加唯一性約束,使其成為超鍵

例如,有一個學生表(學號,姓名,性別,年齡,身份證,班級),那么{學號}、{身份證}、{學號, 姓名}、{學號, 性別}等都是超鍵,{姓名},{姓名,性別}不是超鍵。

5、候選鍵

候選鍵,又叫候選碼,是最小的超鍵,不含有多余屬性的超鍵,也就是一個屬性可以表示超鍵的話,就沒必要使用多個屬性。

在一個關系中,可能存在多個候選鍵

特點:

  • 唯一性:候選鍵的值在關系中是唯一的,沒有重復的記錄。
  • 最小性:候選鍵是最小的屬性集合,即不能再刪除任何一個屬性而保持唯一性。

例如,還是以學生表(學號,姓名,性別,年齡,身份證,班級)來說,{學號}、{身份證}都是候選鍵,因為它唯一標識每個學生;{學號, 性別}不是候選鍵,因為它包含了多余屬性。

6、主鍵

主鍵,又叫主碼,是從候選鍵中選擇的一個鍵,用于唯一標識關系中的每個元組。

主鍵必須是唯一且非空的。在關系中,只能有一個主鍵。

例如,在學生表中,{學號}、{身份證}都可以作為主鍵。
注:還是要根據場景,來定主鍵,比如身份證,一般在實際生產中,我們不用它當主鍵。

7、主屬性

主屬性,是指在主鍵中的屬性,它們是用來唯一標識每個元組的關鍵屬性。

如果主鍵包含多個屬性,那么這多個屬性都是主屬性。

例如,在學生表中,{學號}是主鍵,因此它也是主屬性。

8、外鍵

外鍵,又叫外碼,是指其它表的主鍵。

例如,在學生表中,{班級}是外鍵,因為它是班級表的主鍵

9、函數依賴

一個屬性的值(或屬性集合的值)對于另一個屬性的值(或屬性集合的值)具有決定性影響,即給定一個屬性(或屬性集合)的值,可以唯一確定另一個屬性(或屬性集合)的值

例如,如果屬性A的值決定了屬性B的值,可以表示為 A -> B。這意味著在給定A的值的情況下,可以唯一確定B的值。

完全依賴

如果一個屬性(或屬性集合)對于另一個屬性(或屬性集合)的值具有完全依賴,那么沒有任何冗余的屬性可以從該依賴中刪除,否則將無法唯一確定被依賴的屬性(或屬性集合)的值。

例如,假設有一個關系模式R(A, B, C),其中屬性A和屬性B的組合決定了屬性C的值。如果刪除屬性A或屬性B中的任何一個,都無法唯一確定屬性C的值,那么我們可以說屬性C對于屬性A和屬性B具有完全依賴。

二、數據庫范式

主要有第一范式、第二范式、第三范式、巴斯-科德范式,第四范式和第五范式,前面是后續范式的基礎,級別越高,數據庫越標準。

1、第一范式(1NF)

1NF=First Normal Form
強調屬性都是原子的,不可再拆分

例如,學生表(學號,姓名,班級,學生所在班級中的座位號,班主任,性別,年齡,是否成年,身份證號碼),這個表設計符不符合第一范式?

這種得看業務場景了,如果需要展示xx姓同學,比如黃同學,李同學,歐陽同學這種,是不是就不符合,因為姓可能有多個字,比如歐陽索隆,歐陽修,你怎么知道姓歐還是歐陽,這種根本無法拆分,所以,需要把姓和名拆開存,不然不好展示,代碼邏輯也比較復雜,所以這里的姓名還可以再拆分,就不符合第一范式了。

2、第二范式(2NF)

非主鍵屬性完全依賴于主鍵,消除部分依賴

假設(A,B)是主鍵,完全依賴指的是(A,B) ->(C),部分依賴指的是(A)->(C)。

還是以學生表(學號,姓名,班級,學生所在班級中的座位號,班主任,性別,年齡,是否成年,身份證號碼)為例,這個表設計符不符合第二范式?

{班級,學生所在班級中的座位號}是主鍵,但{班主任}由班級決定,沒有完全依賴于主鍵,不符合第二范式,而且會有性能影響,這里數據冗余了,可能導致數據不一致,如果班主任有變更,很多學生記錄都要同步修改,不然就出現了數據不一致。

解決方案:拆表,班主任字段拆出去
學生表(學號,姓名,班級,學生所在班級中的座位號,性別,年齡,是否成年,身份證號碼)
班級表(班級,班主任)

3、第三范式(3NF)

非主鍵屬性不傳遞依賴于主鍵,直接依賴于主鍵,消除傳遞依賴

假設A是主鍵,存在A->B->C,那么說C傳遞依賴于A。

例如,前面滿足第二范式的表結構如下,這個表設計符不符合第三范式?
學生表(學號,姓名,班級,學生所在班級中的座位號,性別,年齡,是否成年,身份證號碼)
班級表(班級,班主任)

年齡,是否成年,身份證號碼,性別,都是非主鍵列,“年齡”和“性別”都可以由“身份證號碼”推出,“是否成年”可以由“年齡”推出,所以不符合第三范式

解決方案:拆表,把年齡,是否成年,身份證號碼拆出去
學生表(學號,姓名,班級,學生所在班級中的座位號,身份證號碼)
班級表(班級,班主任)
身份證號碼關系表(身份證號碼,年齡,性別)
年齡關系表(年齡,是否成年)

上面這種場景,在實際環境中,需要維護多一些表或者Java代碼進行判斷,都有性能消耗,代碼的話,每次查詢的時候,代碼都要計算1次,那么我們可以采取物化視圖,插入年齡的時候,直接計算好,提升性能,具體實現可以參考數據庫對象介紹與實踐:視圖、函數、存儲過程、觸發器和物化視圖

4、巴斯-科德范式(BCNF)

對第三范式的優化,在它基礎上,消除對主鍵子集的依賴而得到的,即非主鍵屬性完全依賴于候選鍵

學生表(學號,姓名,班級,學生所在班級中的座位號,身份證號碼)
班級表(班級,班主任)
身份證號碼關系表(身份證號碼,年齡,性別)
年齡關系表(年齡,是否成年)

這個設計符不符合巴斯-科德范式?

學生所在班級中的座位號完全依賴于{學號,班級},而不依賴于學號,所以符合

5、第四范式(4NF)

要求消除非平凡多值依賴。

假設有一個關系表格包含以下列:學生ID、課程ID、學生成績1、學生成績2。如果每個學生ID和課程ID的組合可以決定多個學生成績的值,而不是只有一個固定的學生成績值,那么就存在一個非平凡多值依賴。

6、第五范式(5NF)

要求消除非平凡函數依賴。

假設有一個關系表格包含以下列:學生ID、學生姓名、學生年齡。如果每個學生ID都唯一確定一個學生姓名,那么學生ID對學生姓名存在一個非平凡函數依賴。因為在現實生活中,學生ID并不直接決定學生姓名,而是通過其他信息或邏輯來確定。

三、反范式

反范式(Denormalization)是一種數據庫設計技術,旨在提高數據庫的性能和查詢效率,但可能會犧牲一部分數據的一致性和完整性。

在范式化的數據庫設計中,數據被分解為多個表,以減少數據冗余和提高數據的一致性。然而,范式化的數據庫結構可能導致在進行復雜查詢時需要進行多個表的連接操作,從而影響查詢性能。

反范式化通過將分解的表重新合并或添加冗余數據,以減少表之間的連接操作,從而提高查詢性能。這樣可以簡化查詢的復雜性,減少查詢的執行時間。

導致的問題:

  • 增加存儲空間,數據冗余字段
  • 增大更新風險,更新時,需要確保所有相關的冗余數據都得到正確的更新,以保持數據的一致性

四、總結

在實際工作中,一般遵守1NF、2NF、3NF即可,但一般用反范式,可以顯著提高性能優勢,我們需要自己權衡下,根據具體的應用場景和性能需求來決定使用啥范式。

經驗之談:

  • 設計的時候,腦子里要有范式,用于指導設計
  • 遵守范式,然后根據業務,再做反范式

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

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

相關文章

uc_14_IP地址_套接字_字節序轉換

1 計算機網絡 計算機網絡,是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來,在網絡操作系統、網絡管理軟件及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。 網絡協議是一種特…

C語言文本模式和二進制模式

前言 本篇文章介紹一下C語言的文本模式和二進制模式 文本文件和二進制文件 從宏觀上看,無論是文本文件還是二進制文件,文件中保存的都是0和1的序列,因為磁盤只有這兩種狀態。不同的文件只是對0、1序列的解釋不同,如果文件內容是…

AtCoder ABC周賽2023 11/4 (Sat) E題題解

目錄 原題截圖: 原題翻譯 題目大意: 主要思路: 代碼: 原題截圖: 原題翻譯 題目大意: 給你一個數組,給你一個公式,讓你選k個元素,用公式算出最終得分。 主要思路&am…

X86匯編語言:從實模式到保護模式(代碼+注釋)--c6

X86匯編語言:從實模式到保護模式(代碼注釋)–c6 標志寄存器FLAGS: 6th:ZF位(Zero Flag):零標志,執行算數或者邏輯運算之后,會將該位置位。10th:D…

安全運營 -- 100個藍隊溯源技巧(逐步更新)

0x00 背景 記錄一些常用的入侵排查命令和日常運維思路分享。(排名不分先后,逐步更新ing) 0x01 linux 查詢所有用戶計劃任務 cat /etc/passwd|cut -f 1 -d : |xargs -I {} crontab -l -u {} 0x02 排查linux記錄密碼后門 strace 監聽ssh來源流量記錄密碼后門(本機輸入的密碼記…

Shell數組函數:數組——數組和循環(三)

數組統計性別 一、定義性別文件 [root192 ~]# vim sex.txt jack m alice f tom m 二、定義腳本統計性別 [root192 ~]# vim sex.sh #!/bin/bash declare -A sex while read line dotypeecho $line | awk {print $2}let sex[$type] done < sex.txtfor i in ${!sex[]} doecho…

Linux基礎——進程初識(一)

1. 硬件 ①馮諾依曼體系 我們常見的計算機&#xff0c;如筆記本。我們不常見的計算機&#xff0c;如服務器&#xff0c;大部分都遵守馮諾依曼體系。其詳細結構如下圖所示 在這里有幾點要說明 1. 這里的儲存器實際上指的是內存 2. 輸入設備與輸出設備都屬于外設 常見的輸入設備…

實現SQL server數據庫完整性

1.創建一個數據庫名為“erp” 主數據文件&#xff1a;初始容量為5MB&#xff0c;最大容量為50MB&#xff0c;遞增量為1MB&#xff0c;其余參數自設。事務日志文件&#xff1a;初始容量為3MB&#xff0c;最大容量為20MB&#xff0c;遞增量為10%&#xff0c;其余參數自設。 創建…

與脾氣不太好的領導,相處原則和相處技巧分享

前言 工作上我看到有的人擅長和各種類型領導相處&#xff0c;而有的人則和領導相處不愉快&#xff0c;不懂靈活變通的人 和領導相處出現沖突時則是當面懟領導&#xff0c;不給領導面子&#xff0c;之后被領導打壓&#xff0c;甚至有的人和領導相處 不和離開等等&#xff0c;…

多個HTML屬性

在HTML中&#xff0c;屬性用于提供有關HTML元素的附加信息。在這篇文章中你將學習多個HTML屬性&#xff0c;它們可以增強網站的視覺吸引力。 接下來開始吧&#xff01;&#x1f680; Accept 屬性 您可以將accept屬性與<input>元素&#xff08;僅用于文件類型&#xff…

SPECPOWER2008

一、前言# 1、軟件說明# 官網&#xff1a;SERT套件用戶指南2.0.5SPECpower介紹SPEC基準及工具SPECpower_ssj2008測試結果SPECpower_ssj2008-Design_ccs - SPEC# SPEC&#xff08;the Standard Performance Evaluation Corporation&#xff09;是一個由計算機硬件廠商、軟件公…

jsp頁面通過class或者id獲取a標簽上的屬性的值

要通過class和id兩種方式獲取a標簽上的某個屬性的值&#xff0c;或者給其賦值&#xff0c;可以使用JavaScript。以下是兩種方法的示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…

[ 藍橋杯Web真題 ]-Markdown 文檔解析

目錄 介紹 準備 目標 規定 思路 補充知識 解法參考 介紹 Markdown 因為其簡潔的語法大受歡迎&#xff0c;已經成為大家寫博客或文檔時必備的技能點&#xff0c;眾多博客平臺都提倡用戶使用 Markdown 語法進行文章書寫&#xff0c;然后再發布后&#xff0c;實時的將其轉化…

【Element-ui】Icon 圖標與Button 按鈕

文章目錄 前言一、Icon 圖標1.1 作用1.2 使用方法1.3 圖標集合 二、Button 按鈕2.1 基礎用法2.2 禁用狀態2.3 文字按鈕2.4 圖標按鈕2.5 按鈕組2.6 加載中2.7 不同尺寸 總結 前言 在前端開發中&#xff0c;界面的設計和交互是至關重要的一部分。一個直觀、易用的界面往往離不開…

AcGeLinearEnt2d::getPerpLine函數

AcGeLinearEnt2d::getPerpLine函數是AutoCAD圖形庫&#xff08;AutoCAD Geometry Library&#xff0c;即AcGe&#xff09;中的一個成員函數&#xff0c;用于獲取一個通過指定點且垂直于當前直線或線性實體的無限長直線。 函數的參數和返回值說明如下&#xff1a; const AcGeP…

js寫旋轉的時鐘動態

目錄 1、css代碼 2.html代碼 3.js代碼 1、css代碼 .box {position: relative;width: 600px;height: 600px;background: url(./images/clock.jpg) no-repeat center;}.hour,.minute,.second {position: absolute;left: 0;top: 0;width: 100%;height: 100%;}.hour {background…

上個月暴漲34.6%后,SoundHound AI股票現在還能買入嗎?

來源&#xff1a;猛獸財經 作者&#xff1a;猛獸財經 揭開SoundHound AI股價波動的原因 S&P Global Market Intelligence的數據顯示&#xff0c;在擺脫了10月份的大幅下跌后&#xff0c;SoundHound AI的股價在11月份實現了34.6%的漲幅。 原因是該公司公布了穩健的第三季…

英文論文查重復率網址

大家好&#xff0c;今天來聊聊英文論文查重復率網址&#xff0c;希望能給大家提供一點參考。 以下是針對論文重復率高的情況&#xff0c;提供一些修改建議和技巧&#xff1a; 英文論文查重復率網址 在撰寫英文論文時&#xff0c;查重是確保論文原創性和質量的重要環節快碼論文…

國產化, 海量數據庫 VastbaseG100 兼容適配

背景&#xff1a; 客戶是國內某家電龍頭企業&#xff0c;應國產化政策要求&#xff0c; 系統需要適配國產數據庫&#xff0c; Vastbase G100 遇到問題&#xff1a; 1. 數據庫連接&#xff1a; Vastbase 是基于 postgresql 進行封裝&#xff0c; 所以理論上是兼容的&#…

Efficient physics-informed neural networks using hash encoding

論文閱讀&#xff1a;Efficient physics-informed neural networks using hash encoding Efficient physics-informed neural networks using hash encoding簡介方法PINN哈希編碼具有哈希編碼的 PINN 實驗Burgers 方程Helmholtz 方程N-S 方程訓練效率對比 總結 Efficient physi…