數據庫設計三范式
設計數據庫表的時候所依據的規范,共三個規范:
第一范式:要求有主鍵,并且要求每一個字段原子性不可再分
第二范式:要求所有非主鍵字段完全依賴主鍵,不能產生部分依賴
第三范式:所有非主鍵字段和主鍵字段之間不能產生傳遞依賴
第一范式
數據庫表中不能出現重復記錄,每個字段是原子性的不能再分
不符合第一范式的實例:
第一范式1.PNG
存在問題:
最后一條記錄和第一條重復(不唯一,沒有主鍵)
聯系方式字段可以再分,不是原子性的
第一范式2.PNG
關于第一范式,每一行必須唯一,也就是每個表必須有主鍵,這是數據庫設計的最基本要求,主要采用數值型或定長字符串表示,關于列不可再分,應該根據具體的情況來決定。如聯系方式,為了開發上的便利可能就采用一個字段。
第二范式
第二范式是建立在第一范式基礎上的,另外要求所有非主鍵字段完全依賴主鍵,不能產生部分依賴
實例:
二1.PNG
確定主鍵:
二2.PNG
以上雖然確定了主鍵,但此表會出現大量的冗余,主要涉及到的冗余字段為“學生姓名”和“教師姓名”,出現冗余的原因在于,學生姓名部分依賴了主鍵的一個字段學生編號,而沒有依賴教師編號,而教師姓名部分依賴了主鍵的一個字段教師編號,這就是第二范式部分依賴。
解決:
解決.PNG
如果一個表是單一主鍵,那么它就是復合第二范式,部分依賴和主鍵有關系
以上是典型的“多對多”設計
第三范式
建立在第二范式基礎上的,非主鍵字段不能傳遞依賴于主鍵字段(不要產生傳遞依賴)
三1.PNG
上表中,班級名稱字段存在冗余,因為班級名稱字段沒有直接依賴于主鍵,班級名稱字段依賴于班級編號,班級編號依賴于學生編號,這就是傳遞依賴,解決的辦法就是將冗余字段單獨拿出來建立表:
解決三.PNG
以上設計是典型的一對多的設計,一存儲在一張表中,多存儲在一張表中,在多的那張表中添加外鍵指向一的一方
幾個經典的設計:
一對一:
第一種方案:分兩張表存儲,共享主鍵
第二種方案:分兩張表存儲,外鍵唯一
一對多:
分兩張表存儲,在多的一方添加外鍵,
這個外鍵字段引用一的一方中的主鍵字段
多對多:
分三張表存儲,在學生表中存儲學生信息,在課程表中存儲課程信息,
在學生選課表中存儲學生和課程的關系信息
共享主鍵.PNG
外鍵唯一.PNG
實際開發中,數據庫設計盡量遵循三范式,但是還是根據實際情況進行取舍,有時可能會拿冗余換速度,最終目的是要滿足客戶需求