MySql資料庫設計三正規化
阿新 • • 發佈:2020-12-21
第一正規化
任何一張表都應該有主鍵,並且每一個欄位原子性不可再分。
第二正規化
建立在第一正規化的基礎之上,所有非主鍵欄位完全依賴主鍵,不能產生部分依賴。如果一個表是單一主鍵,那麼它就複合第二正規化,部分依賴和主鍵有關係
多對多?三張表,關係表兩個外來鍵。
一個學生有多個老師,一個老師也有多個學生。
t_student學生表
sno(pk) sname
-------------------
1 張三
2 李四
3 王五
t_teacher 講師表
tno(pk) tname --------------------- 1 王老師 2 張老師 3 李老師
t_student_teacher_relation 學生講師關係表
id(pk) sno(fk) tno(fk)
----------------------------------
1 1 3
2 1 1
3 2 2
4 2 3
5 3 1
6 3 3
第三正規化
建立在第二正規化的基礎之上,所有非主鍵欄位直接依賴主鍵,不能產生傳遞依賴。
一對多?兩張表,多的表加外來鍵。
一個班級對應多個學生,一個學生只有一個班級。
班級t_class
cno(pk) cname -------------------------- 1 班級1 2 班級2
學生t_student
sno(pk) sname classno(fk)
---------------------------------------------
101 張1 1
102 張2 1
103 張3 2
104 張4 2
105 張5 2
以上設計是一種典型的一對多的設計,一儲存在一張表中,多儲存在一張表中,在多的那張表中新增外來鍵指向一的一方的主鍵
總結
- 第一正規化:資料表中每個欄位都必須是不可拆分的最小單元,也就是確保每一列的原子性;
- 第二正規化:滿足一正規化後,表中每一列必須有唯一性,都必須依賴於主鍵;
- 第三正規化:滿足二正規化後,表中的每一列只與主鍵直接相關而不是間接相關(外來鍵也是直接相關),欄位沒有冗餘。
一對一怎麼設計?
一對一設計有兩種方案:主鍵共享
t_user_login 使用者登入表
id(pk) username password
--------------------------------------
1 zs 123
2 ls 456
t_user_detail 使用者詳細資訊表
id(pk+fk) realname tel ....
--------------------------------------------------------------------
1 張三 1111111111
2 李四 1111415621
一對一設計有兩種方案:外來鍵唯一。
t_user_login 使用者登入表
id(pk) username password
--------------------------------------
1 zs 123
2 ls 456
t_user_detail 使用者詳細資訊表
id(pk) realname tel userid(fk+unique)....
-----------------------------------------------------------
1 張三 1111111111 2
2 李四 1111415621 1