這裏是修真院後端小課堂,每篇分享文從java
【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】程序員
八個方面深度解析後端知識/技能,本篇分享的是:數據庫
【什麼是數據庫範式,是否應該嚴格遵照範式,什麼狀況下應該不遵照範式? 】後端
【修真院java 小課堂】 什麼是數據庫範式,是否應該嚴格遵照範式,什麼狀況下應該不遵照範式?安全
你們好,我是IT修真院鄭州分院第12期的學員張泉良,一枚正直純潔善良的JAVA程序員,今天給你們分享一下,數據結構
修真院官網JAVA任務三,深度思考中的知識點——什麼是數據庫範式,是否應該嚴格遵照範式,什麼狀況下應該不遵照範式?函數
(1) 關係型數據庫性能
關係型數據庫是依據關係模型來建立的數據庫編碼
關係模型就是指二維表格模型,於是一個關係型數據庫就是由二維表及其之間的聯繫組成的一個數據組織.net
關係模型包括數據結構(數據存儲的問題,二維表)、操做指令集合(SQL語句)、完整性約束
(表內數據約束、表與表之間的約束)
(2)常見的關係數據庫:
Oracle、DB二、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL
安全(由於存儲在磁盤)
容易理解(創建在關係模型上)
但不節省空間)
中間產生的規則就是範式以及約束
(1) 什麼是範式
當設計關係型數據庫時,須要聽從不一樣的規範要求,設計出合理的關係型數據庫,
這些不一樣的規範要求被稱爲不一樣的範式(Normal Form),
越高的範式數據庫冗餘越小。應用數據庫範式能夠帶來許多好處,
可是最主要的目的是爲了消除重複數據,減小數據冗餘,讓數據庫內的數據更好的組織,
讓磁盤空間獲得更有效的利用。
範式的缺點:範式使查詢變的至關複雜,在查詢時須要更多的鏈接,
一些複合索引的列因爲範式化的須要被分割到不一樣的表中,致使索引策略不佳。
(2)什麼是第1、2、3、BC範式?
所謂「第幾範式」,是表示關係的某一種級別,因此常常稱某一關係R爲第幾範式。
目前關係型數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、
巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。
知足最低要求的範式是第一範式(1NF)。在第一範式的基礎上進一步知足更多規範要求的稱爲第二範式(2NF),
其他範式以次類推。知足高等級的範式的先決條件是必須先知足低等級範式。
4NF:要求把同一表內的多對多關係刪除
5NF:從最終結構從新創建原始結構
(3) 範式中會用到的一些經常使用概念
a、實體(Entity):就是實際應用中要用數據描述的事物,它是現實世界中客觀存在並能夠被區別的事物
b、數據項(Data Item):即字段(Fields)也可稱爲域、屬性、列。數據項是數據的不可分割的最小單位。
c、數據元素(Data Element):數據元素是數據的基本單位。數據元素也稱元素、行、元祖、記錄(Record)。
一個數據元素能夠由若干個數據項組成。表中的一行就是一個元組。
d、碼:也稱爲鍵(Key),它是數據庫系統中的基本概念。所謂碼就是能惟一標識實體的屬性,它是整個實體集的性質,而不是單個實體的性質。它包括超碼、候選碼和主碼。
e、超碼:超碼是一個或多個屬性的集合,這些屬性的組合能夠在一個實體集中惟一地標識一個實體。
若是K是一個超碼,那麼K的任意超集也是超碼,也就是說若是K是超碼,那麼全部包含K的集合也是超碼。
f、候選碼:在一個超碼中,可能包含了可有可無的屬性,若是對於一些超碼,他們的任意真子集都不能成爲超碼,那麼這樣的最小超碼稱爲候選碼。
g、主碼:從候選碼中挑一個最少鍵的組合,它就叫主碼(主鍵,Primary Key)。
每一個主碼應該具備下列特徵:1.惟一的。2.最小的(儘可能選擇最少鍵的組合)。3.非空。4.不可更新的
h、全碼:若是一個碼包含了全部的屬性,這個碼就是全碼(All-key)。
主屬性:一個屬性只要在任何一個候選碼中出現過,這個屬性就是主屬性(Prime Attribute)。
非主屬性:與主屬性相反,沒有在任何候選碼中出現過,這個屬性就是非主屬性(Nonprime Attribute)或非碼屬性
g、外碼:關係模式R中的一個屬性或屬性組X並不是R的碼,但X是另外一個關係模式的碼,則稱X是R的外碼,也稱外鍵(Foreign Key)。
k、依賴表(Dependent Table):也稱爲弱實體(Weak Entity)是須要用父表標識的子表。
m、關聯表(Associative Table):是多對多關係中兩個父表的子表。
n、函數依賴:函數依賴是指關係中一個或一組屬性的值能夠決定其它屬性的值。
函數依賴:X → Y。函數依賴不是指關係模式R的某個或某些關係知足的約束條件,
而是指R的一切關係均要知足的約束條件。
o、徹底函數依賴:在一個關係中,若某個非主屬性數據項依賴於所有關鍵字稱之爲徹底函數依賴。
p、傳遞函數依賴:指的是若是存在「A → B → C」的決定關係,則C傳遞函數依賴於A。
(1)、如何更好的區分三大範式
第 一範式和第二範式在於有沒有分出兩張表,
第二範式是說一張表中包含了多種不一樣的實體屬性,那麼要必須分紅多張表,
第三範式是要求已經分紅了多張表,那麼一張表中只能有另外一張表中的id(主鍵),
而不能有其餘的任何信息(其餘的信息一概用主鍵在另外一表查詢)。
(2)、外鍵的注意點
只有INNODB的數據庫引擎支持外鍵
外鍵必須與參照列的數據類型必須相同(數值型要求長度和無符號都相同,字符串要求類型相同,長度能夠不一樣)
CONSTRAINT 外鍵名 FOREIGN KEY (外鍵字段)REFERENCES 參照表 (參照字段)
CASCADE刪除或更新參照表的參照字段時,外鍵表的記錄同步刪除更新
SET NULL 刪除或更新參照表的參照字段時,外鍵表的外鍵設爲NULL
(3)、何謂反範式?什麼狀況須要作反範式設計?
反範式,denormalization,字面上就是作範式的反義詞,事實上也是。
遵循範式整體上來講是爲了保證數據的integrity和減小冗餘,
可是,從直覺上咱們就能夠知道,一個徹底按照範式設計的冗餘極低的數據庫,
極可能在性能上會輸給冗餘相對多一些的數據庫(好比說3NF的數據庫,表多,關係複雜,數據庫的IO次數不少,性能會收到影響)。
最典型的就是在一些數據表中不只存做爲外鍵的user_id,一樣存user_name,這樣雖然違反數據庫範式增長了user_name字段,
可是卻提升了效率,減小了獲取user_id後再去user表中獲取user name的操做
(1):數據庫的約束有哪些
primary KEY:設置主鍵約束
UNIQUE:設置惟一性約束,不能有重複值
DEFAULT 默認值約束,height DOUBLE(3,2)DEFAULT 1.2 height不輸入是默認爲1.2
NOT NULL:設置非空約束,該字段不能爲空;
FOREIGN key :設置外鍵約束。
(2).作範式的目的:
減小冗餘,減小異常(delete,update,insert)
讓數據組織的更加和諧
經過範式的不斷升級,咱們會發現應用的範式等級越高,則表越多。表多會帶來不少問題:
查詢時要鏈接多個表,增長了查詢的複雜度
查詢時須要鏈接多個表,下降了數據庫查詢性能
https://blog.csdn.net/sylvana...
https://blog.csdn.net/apt1203...
https://yq.aliyun.com/ziliao/...
7. 更多討論:
Q1: 什麼是"級聯",級聯操做是什麼意思?
A1:
級聯是用來設計一對多關係的。例如一個表存放老師的信息:表A(姓名,性別,年齡),姓名爲主鍵。
還有一張表存放老師所教的班級信息:表B(姓名,班級)。他們經過姓名來級聯。級聯的操做有級聯更新,級聯刪除。
在啓用一個級聯更新選項後,就可在存在相匹配的外鍵值的前提下更改一個主鍵值。系統會相應地更新全部匹配的外鍵值。若是在表A中將姓名爲張三的記錄改成李四,那麼表B中的姓名爲張三的全部記錄也會隨着改成李四。級聯刪除與更新相相似。若是在表A中將姓名爲張三的記錄刪除,那麼表B中的姓名爲張三的全部記錄也將刪除。
Q2: 設置外鍵之後怎麼新增數據?
A2: (1)先主表插入數據的時候,必須保證關聯外鍵的外鍵表存在主表要插入的數據,
好比:班級信息表中,教師姓名是 外鍵,當咱們插入班級信息中,要想保證老師表中對應姓名村存在
(2) 暫時關閉外鍵約束,可能致使數據不一致
SET SQL_SAFE_UPDATES=0;SET FOREIGN_KEY_CHECKS=0;
Q3: 不創建外鍵,不用錶鏈接,如何查詢兩個關聯表的數據?
A3: 嗯,可使用 where 語句, 好比 select s.name, c.name where s.id= c.id
8. 鳴謝:
9. 結束語:
今天的分享就到這裏啦,歡迎你們點贊、轉發、留言、拍磚~