MySQL數據庫干貨_23——數據庫范式
數據庫范式
數據庫范式簡介
什么是范式(NF = NormalForm)
- 范式是符合某一種設計要求的總結
在數據庫中表的設計,必須保證其合理性
- 數據庫表的設計關系整個系統的架構,關系到后續的開發效率和運行效率
如何設計合理的數據庫表
- 結構合理
- 冗余數據少
- 盡量避免插入刪除修改異常
- 遵循一定的規則,在關系型數據庫中這種規則就稱為范式
關系型數據庫有六種常見范式:
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- 巴斯-科德范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF)
各個范式是依次嵌套包含的:
在第一范式的基礎上進一步滿足更多規范要求的稱為第二范式(2NF),其余范式以此類推。
范式越高,設計質量越高,在現實設計中也越難實現
一般數據庫設計,達到第三范式就足夠了
數據庫范式中的概念
元組:可以理解為一張表中的每條記錄,也就是每一行數據。
屬性:可以看作是“表的一列”。
-
主屬性:
在一個關系中,如一個屬性是構成某一個候選關鍵字的屬性集中的一個屬性,則稱它為主屬性。
例如:在關系——學生(學號,姓名,年齡,性別,班級)中,主屬性是“學號”,那么其他的“姓名”、“年齡”、“性別”、“班級”就都可以稱為非主屬性。
-
非主屬性:
不包含在候選碼中的屬性稱為非主屬性,相對于主屬性來定義的。
第一范式(1NF)
-
最基本的范式,是其他范式的基礎
-
數據庫表每列都是不可分割的基本數據項,同一列中不能有多個值,
確保每列保持原子性
根據第一范式設計表
第一范式存在的問題
-
數據冗余
-
插入數據異常
-
修改數據復雜
-
刪除異常
第二范式(2NF)
第二范式在第一范式的基礎之上更進一層。第二范式需要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。
根據第二范式設計表
第二范式存在問題
-
插入異常
-
刪除異常
第三范式(3NF)
- 必須滿足第二范式
- 確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關
根據第三范式設計表
符合3NF要求的數據庫設計,基本上解決了數據冗余過大,插入異常,修改異常,刪除異常的問題。
數據庫設計范式總結
數據庫設計范式優點:
- 結構合理
- 冗余較小
- 盡量避免插入刪除修改異常
數據庫設計范式缺點:
- 性能降低,多表查詢比單表查詢速度慢
在實際設計中,要整體遵循范式理論
如果在某些特定的情況下還死死遵循范式也是不可取的,
因為可能降低數據庫的效率,此時可以適當增加冗余而提高性能
-
第一范式(1NF):字段不能再分
-
第二范式(2NF):不存在部分依賴
-
第三范式(3NF):不存在間接依賴
使用范式可以減少冗余,但是會降低性能
特定表的的設計可以違反第三范式,增加冗余提高性能
數據庫表關系
表關系簡介
設計關系數據庫的一個重要部分是將數據元素劃分為相關的表,我們可以根據數據本身的關聯性,將不同表之間的數據聚合在一起。
注意:
無論在表與表之間建立了什么樣的關系,決定數據之間是否有關系的不是表,而是數據本身。
表與表的關系類型
表與表之存在三種關系(relation),即一對一,一對多,多對多關系。
- 一對一(one-to-one):一種對象與另一種對象是一一對應關系,比如一個學生只能在一個班級里。
- 一對多(one-to-many): 一種對象可以屬于另一種對象的多個實例,比如一個班級里有很多學生。
- 多對多(many-to-many):兩種對象彼此都是"一對多"關系,比如一個歌單里包含多首歌,同時一首歌可以屬于多個歌單。
一對多關系
一種對象可以屬于另一種對象的多個實例。
一對多關系是建立在兩張表之間的關系。一個表中的一條數據可以對應另一個表中的多條數據。
可以添加外鍵約束保證數據的參照完整性,外鍵永遠在多方。外鍵允許重復,允許含有空值。
注意:
如果添加的外鍵約束,那么刪除數據時,一定是先刪除有外鍵一方的數據。
一對一關系
一種對象與另一種對象是一一對應關系。
一對一關系是建立在一對多的基礎之上,一個表中的一條數據只能對應另一個表中的一條數據。
可以添加外鍵約束保證數據的參照完整性,外鍵可以在任何一方,需要讓外鍵具備唯 一約束。
注意:
如果添加的外鍵約束,那么刪除數據時,一定是先刪除有外鍵一方的數據。
多對多關系
兩種對象彼此都是"一對多"關系
需要建立一個中間表,中間表里建立兩個列,然后需要用這兩個列作為這個表的聯合主鍵,然后每個列在作為外鍵參照各自的表的主鍵。
注意:
存數據:先兩側,再中間表。
刪數據:先中間表(即有外鍵的表),再兩側。
浙公網安備 33010602011771號