1. 程式人生 > 資料庫 >Mysql學習筆記#7-正規化

Mysql學習筆記#7-正規化

正規化

正規化,設計的越詳細,對於某些實際操作可能更好,但是不一定都是好處,在實際應用中,應當具體情況具體分析

資料依賴

資料依賴有三種類型

函式依賴

設R(U)是一個屬性集U上的關係模式,X和Y是U的子集,若對於R(U)的任意一個可能的關係r,r中不可能存在兩個元組在X上的屬性值相等,而在Y上的屬性值不等
則稱“X函式確定Y”或“Y函式依賴於X”,記作X→Y,X成為這個函式依賴的決定屬性集

例:每個學校對應一個校長,當學校確定時,校長也確定了,則稱“學校確定校長”,或者“校長依賴於學校”,記作學校→校長

平凡函式依賴

如果X→Y,但是X不屬於Y,則稱X→Y是非平凡的函式依賴
如果X→Y,但是X屬於Y,則稱X→Y是平凡的函式依賴

例:(學號,課程號)→ 成績 是非平凡函式依賴
(學號,課程號)→ 學號 是平凡函式依賴
(學號,課程號)→ 課程號 是平凡函式依賴

完全函式依賴

如果單獨一個函式能決定一個依賴,則稱該依賴為完全函式依賴,如果一個函式的部分可以決定一個依賴,則稱該依賴為部分函式依賴

例:學號→姓名 完全函式依賴
(學號,課程號)→ 姓名 部分函式依賴(學號自己就能決定姓名)
(學號,課程號)→ 成績 完全函式依賴(由學號和課程號共同決定成績)

傳遞函式依賴

如果X→Y,Y→Z,且Y不屬於X,Y不決定X,則稱Z傳遞函式依賴於X
如果Y→X,即X←→Y,則Z直接依賴於X

第一正規化(1NF)

資料表中的欄位都是不可分割的原子值

例如:中國四川省成都市武侯區武侯大道100號
這個地址可以拆分為國家、省、市等資訊,不滿足第一正規化的不可分割的要求,因此這個地址不滿足第一正規化

第二正規化(2NF)

必須在滿足第一正規化的前提下,第二正規化要求,除主鍵外的每一列都必須完全依賴於主鍵
如果要出現不完全依賴,只可能發生在聯合主鍵的情況下
通俗來說,主鍵必須能決定其他列(例:學校決定校長)

當出現除主鍵外的其他列,只依賴於主鍵的部分欄位時,將不滿足第二正規化
此時可以拆表

例:新建一個訂單表

QQ圖片20201202224528

這個表使用了聯合主鍵(product_id,customer_id),但是product_name於customer都部分依賴於主鍵,因此不滿足第二正規化,此時應該將這個表拆開

create table myorder(
order_id int primary key,
product_id int,
customer_id int
);

create table product(
id int primary key,
name varchar(20)
);

create table customer(
id int primary key,
name varchar(20)
);

第三正規化(3NF)

必須先滿足第二正規化,除開主鍵列的其他列之間不能有傳遞依賴關係

例:
create table myorder(
order_id int primary key,
product_id int,
customer_id int,
customer_phone varchar(15)
);

在這個例子中,customer_phone這個屬性就和customer_id、order_id之間存在傳遞依賴,因此不滿足第三正規化

應該將上述例子拆分

create table myorder(
order_id int primary key,
product_id int,
customer_id int
);
create teble customer(
id int primary key,
name varchar(20),
phone varchar(15)
);

這樣才滿足第三正規化