1. 程式人生 > 其它 >MySql資料庫設計三正規化

MySql資料庫設計三正規化

技術標籤:C_資料庫階段C1_MySql資料庫mysql

第一正規化

任何一張表都應該有主鍵,並且每一個欄位原子性不可再分。
在這裡插入圖片描述

第二正規化

建立在第一正規化的基礎之上,所有非主鍵欄位完全依賴主鍵,不能產生部分依賴。如果一個表是單一主鍵,那麼它就複合第二正規化,部分依賴和主鍵有關係
在這裡插入圖片描述

多對多?三張表,關係表兩個外來鍵。

一個學生有多個老師,一個老師也有多個學生。
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