SQL三大正規化

2021-09-14 01:42:39 字數 2289 閱讀 1135

第一正規化(1nf)

(必須有主鍵,列不可分)

資料庫表中的任何欄位都是單一屬性的,不可再分

create table aa(id int,nameage varchar(100)) 

insert aa values(1,''無限-女 '') 

沒有達到第一正規化 

create table aa(id int,name varcahr(10),age char(2)) 

insert aa values(1,''無限'',''女 '') 

達到第一正規化

第二正規化(2nf)

資料庫表中非關鍵字段對任一候選關鍵字段的 都 不存在部分函式依賴

(當乙個表是復合主鍵時,非主鍵的字段不依賴於部分主鍵(即必須依賴於全部的主鍵字段))

create table sci(

sno int(32),cno int(32),grade int(32),credit int(32),

primary key sno,cno

課程(cno)1---1學分(credit)

學生(sno)n---n課程(cno)

學生+課程--->分數(grade)

scisno cno grade credit

1    1   60     80

2    1    90     80

3   1    70     80

如此以來,學分被大量重複儲存,資料冗餘

如要某課程學分,則要大量重複操作

如要加新課程,由於sno和cno共同做為主鍵,則在加入新課程時,必須有人選該課

如某學生某課程結業,則該學生其它課程資訊也同時被刪除了

總之這種設計不太好吧,非關鍵字屬性credit僅函式依賴於cno,也就是credit部分依賴組合關鍵字(sno,cno)而不是完全依賴

解決分成兩個關係模式 sc1(sno,cno,grade),c2(cno,credit)。新關係包括兩個關係模式,它們之間通過sc1中的外關鍵字cno相聯絡,需要時再進行自然聯接,恢復了原來的關係

第三正規化(3nf)

關係模式r(u,f)中的所有非主屬性對任何候選關鍵字都不存在傳遞依賴

likes:即所有的非主鍵屬性都依賴於主鍵屬性,不能依賴於非主鍵屬性,如果依賴則應該拆分表,是被依賴的非主鍵屬性作為此表的外來鍵,新錶的主鍵。

例----s1(sno,sname,dno,   dname, location)

學號 姓名   所在系 系名稱 系位址 

關鍵字sno決定各個屬性。由於是單個關鍵字,沒有部分依賴的問題,肯定是2nf。但這關係肯定有大量的冗餘,有關學生所在的幾個屬性dno,dname,location將重複儲存,插入,刪除和修改時也將產生類似以上例的情況。 

原因:關係中存在傳遞依賴造成的。即sno 1->1 dno。 而dno 1->n sno卻不存在, 而dno -> location存在, 因此關鍵遼 sno 對 location 函式決定是通過傳遞依賴 sno -> location 實現的。也就是說,sno不直接決定非主屬性location。 

解決目地:每個關係模式中不能留有傳遞依賴。 

解決方法:分為兩個關係 s(sno,sname,dno)(likes:此時dno為外來鍵),d(dno,dname,location) 

注意:關係s中不能沒有外關鍵字dno。否則兩個關係之間失去聯絡

鮑依斯-科得正規化(bcnf)

在3nf的基礎上,庫表中任何欄位對任一候選關鍵字段的傳遞函式依賴都不存在

倉庫管理關係表為storehousemanage(倉庫id, 儲存物品id, 管理員id, 數量),且管理員1---1倉庫;倉庫1---n物品。這個資料庫表中存在如下決定關係: 

(倉庫id, 儲存物品id) →(管理員id, 數量)

(管理員id, 儲存物品id) → (倉庫id, 數量)

所以,(倉庫id, 儲存物品id)和(管理員id, 儲存物品id)都是storehousemanage的候選關鍵字,表中的唯一非關鍵字段為數量,它是符合第三正規化的。但是,由於存在如下決定關係:

(倉庫id) → (管理員id)

(管理員id) → (倉庫id)

即存在關鍵字段決定關鍵字段的情況,所以其不符合bcnf正規化

解決:把倉庫管理關係表分解為二個關係表: 

倉庫管理:storehousemanage(倉庫id, 管理員id)

倉庫:storehouse(倉庫id, 儲存物品id, 數量)

SQL三大正規化

第一正規化 確保每列的原子性.如果每列 或者每個屬性 都是不可再分的最小資料單元 也稱為最小的原子單元 則滿足第一正規化.例如 顧客表 姓名 編號 位址 其中 位址 列還可以細分為國家 省 市 區等。第二正規化 在第一正規化的基礎上更進一層,目標是確保表中的每列都和主鍵相關.如果乙個關係滿足第一正規...

SQL三大正規化原來如此呵呵

第一正規化 1nf 必須有主鍵,列不可分 資料庫表中的任何欄位都是單一屬性的,不可再分 create table aa id int,nameage varchar 100 insert aa values 1,無限 女 沒有達到第一正規化 create table aa id int,name v...

三大正規化和BC正規化

資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的 結構明晰的,同時,不會發生插入 insert 刪除 delete 和更新 update 操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了 大量不需要的冗餘資訊。設計正規化是不是很難懂...