資料庫 正規化

2021-08-08 19:06:59 字數 3658 閱讀 1924

碼(候選關鍵字)設 k 為某錶中的乙個屬性或屬性組,若除 k 之外的所有屬性都完全函式依賴於 k(這個「完全」不要漏了),那麼我們稱 k 為候選碼,簡稱為。在實際中我們通常可以理解為:假如當 k 確定的情況下,該錶除 k 之外的所有屬性(非主關鍵字段)的值也就隨之確定,那麼 k 就是碼。一張表中可以有超過乙個碼。(實際應用中為了方便,通常選擇其中的乙個碼作為主碼

主屬性/非主屬性:

包含在任何乙個碼中的屬性成為主屬性。

函式依賴我們可以這麼理解(但並不是特別嚴格的定義):若在一張表中,在屬性(或屬性組)x的值確定的情況下,必定能確定屬性y的值,那麼就可以說y函式依賴於x,寫作 x → y。也就是說,在資料表中,不存在任意兩條記錄,它們在x屬性(或屬性組)上的值相同,而在y屬性上的值不同。這也就是「函式依賴」名字的由來,類似於函式關係 y = f(x),在x的值確定的情況下,y的值一定是確定的。

回過來看2nf了。首先,我們需要判斷,表3是否符合2nf的要求?根據2nf的定義,判斷的依據實際上就是看資料表中是否存在非主屬性對於碼的部分函式依賴。若存在,則資料表最高只符合1nf的要求,若不存在,則符合2nf的要求。判斷的方法是:

第一步:找出資料表中所有的。第二步:根據第一步所得到的碼,找出所有的主屬性。第三步:資料表中,除去所有的主屬性,剩下的就都是非主屬性了。第四步:檢視是否存在非主屬性對碼的部分函式依賴

對於表3,根據前面所說的四步,我們可以這麼做:

第一步:

檢視所有每一單個屬性,當它的值確定了,是否剩下的所有屬性值都能確定。

檢視所有包含有兩個屬性的屬性組,當它的值確定了,是否剩下的所有屬性值都能確定。

……檢視所有包含了六個屬性,也就是所有屬性的屬性組,當它的值確定了,是否剩下的所有屬性值都能確定。

圖4這一步完成以後,可以得到,表3的碼只有乙個,就是(學號、課名)

第二步:主屬性有兩個:學號課名

第三步:非主屬性有四個:姓名系名系主任分數

第四步:對於(學號,課名) → 姓名,有學號 → 姓名,存在非主屬性姓名對碼(學號,課名)的部分函式依賴。對於(學號,課名) → 系名,有學號 → 系名,存在非主屬性 系對碼(學號,課名)的部分函式依賴。對於(學號,課名) → 系主任,有學號 → 系主任,存在非主屬性 對碼(學號,課名)的部分函式依賴。

所以表3存在非主屬性對於碼的部分函式依賴,最高只符合1nf的要求,不符合2nf的要求。

為了讓表3符合2nf的要求,我們必須消除這些部分函式依賴,只有乙個辦法,就是將大資料表拆分成兩個或者更多個更小的資料表,在拆分的過程中,要達到更高一級正規化的要求,這個過程叫做」模式分解「。模式分解的方法不是唯一的,以下是其中一種方法:選課(學號,課名,分數)學生(學號,姓名,系名,系主任)

(這裡還涉及到乙個如何進行模式分解才是正確的知識點,先不介紹了)

現在我們來看一下,進行同樣的操作,是否還存在著之前的那些問題?

李小明轉系到法律系只需要修改一次李小明對應的系的值即可。——有改進

資料冗餘是否減少了?學生的姓名、系名與系主任,不再像之前一樣重複那麼多次了。——有改進

刪除某個系中所有的學生記錄該系的資訊仍然全部丟失。——無改進

插入乙個尚無學生的新系的資訊。因為學生表的碼是學號,不能為空,所以此操作不被允許。——無改進

所以說,僅僅符合2nf的要求,很多情況下還是不夠的,而出現問題的原因,在於仍然存在非主屬性

系主任對於碼

學號的傳遞函式依賴。為了能進一步解決這些問題,我們還需要將符合2nf要求的資料表改進為符合3nf的要求。

為了讓資料表設計達到3nf,我們必須進一步進行模式分解為以下形式:選課(學號,課名,分數)學生(學號,姓名,系名)系(系名,系主任)

對於選課表,符合3nf的要求,之前已經分析過了。

對於學生表,碼為學號,主屬性為學號,非主屬性為系名,不可能存在非主屬性對於碼的傳遞函式依賴,所以符合3nf的要求。

對於表,碼為系名,主屬性為系名,非主屬性為系主任,不可能存在非主屬性對於碼的傳遞函式依賴(至少要有三個屬性才可能存在傳遞函式依賴關係),所以符合3nf的要求。

bcnf正規化

要了解 bcnf 正規化,那麼先看這樣乙個問題:

若:某公司有若干個倉庫;

每個倉庫只能有一名管理員,一名管理員只能在乙個倉庫中工作;

乙個倉庫中可以存放多種物品,一種物品也可以存放在不同的倉庫中。每種物品在每個倉庫中都有對應的數量。

那麼關係模式 倉庫(倉庫名,管理員,物品名,數量) 屬於哪一級正規化?(步驟:先找出函式依賴集)

答:已知函式依賴集:倉庫名 → 管理員,管理員 → 倉庫名,(倉庫名,物品名)→ 數量碼:(管理員,物品名),(倉庫名,物品名)主屬性:倉庫名、管理員、物品名非主屬性:數量∵ 不存在非主屬性對碼的部分函式依賴和傳遞函式依賴。∴ 此關係模式屬於3nf。

好,既然此關係模式已經屬於了 3nf,那麼這個關係模式是否存在問題呢?我們來看以下幾種操作:

先新增加乙個倉庫,但尚未存放任何物品,是否可以為該倉庫指派管理員?——不可以,因為物品名也是主屬性,根據實體完整性的要求,主屬性不能為空。

某倉庫被清空後,需要刪除所有與這個倉庫相關的物品存放記錄,會帶來什麼問題?——倉庫本身與管理員的資訊也被隨之刪除了。

如果某倉庫更換了管理員,會帶來什麼問題?——這個倉庫有幾條物品存放記錄,就要修改多少次管理員資訊。

從這裡我們可以得出結論,在某些特殊情況下,即使關係模式符合 3nf 的要求,仍然存在著插入異常,修改異常與刪除異常的問題,仍然不是 」好「 的設計。

造成此問題的原因:存在著主屬性對於碼的部分函式依賴與傳遞函式依賴。(在此例中就是存在主屬性【倉庫名】對於碼【(管理員,物品名)】的部分函式依賴。

解決辦法就是要在 3nf 的基礎上消除主屬性對於碼的部分與傳遞函式依賴。

倉庫(倉庫名,管理員)庫存(倉庫名,物品名,數量)

這樣,之前的插入異常,修改異常與刪除異常的問題就被解決了。

以上就是關於 bcnf 的解釋。

資料庫 資料庫正規化

關聯式資料庫的設計規範。不同的規範要求被稱為不同的正規化,越高的正規化資料庫冗餘越小。減少資料庫中資料冗餘的過程 1 第一正規化 1nf 在關係模式r中,當且僅當所有屬性只包含原子值,即每個分量都是不可再分的資料項,則稱r滿足1nf。例如表所示的教師職稱情況關係就不滿足1nf。原因在於,該關係模式中...

資料庫正規化 三正規化

所謂第一正規化 1nf 是指在關係模型中,對域新增的乙個規範要求,所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一正規化 1nf 表中的每個域值只能是實體的乙個屬性或乙個屬性的...

資料庫正規化

注 表在定義中被稱為關係,記作r 欄位在定義中被稱作屬性 模式 資料庫中有三種模式,外模式,內模式,模式 粗體是關鍵字的意思 斜體為外來鍵 以前寫下來的,但是用了多年的帳號已經忘了,唯有把文章轉到這裡來了 真暈哦 http blog.csdn.net fantasylu archive 2004 0...