資料庫正規化理解

2021-05-24 04:36:48 字數 1493 閱讀 4953

當前我們使用的主流資料庫是關係型資料庫,所以我是記錄在關係型資料庫中對正規化的一些理解和看法。資料庫庫正規化分為六種(其實還有有乙個bcnf),分別為從第一正規化到第六正規化。高階一層是建立在所有低層的基礎上的,如第2正規化是建立在第一正規化的基礎上的,依次類推。下面分別舉例講解各種正規化:

第一正規化(1nf)

第一正規化的核心描述為:資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值。該正規化講的是列的原子性。有兩層意思:一層是說每一列只能存乙個屬性值(如果把2個屬性值存在1列中)。第二層說的是在一張表中屬性值不能重複。在現代關係行資料庫中,都是預設滿足第一正規化的,所以你想要寫出不滿足第一正規化的結構來還是不可能的事情,所以第一正規化就不再多說。如果想深入,可以研究下其他非關係型的資料庫的情況。

第二正規化(2nf)

第二正規化的核心描述為:行有唯一的主鍵,非主鍵僅對主鍵依賴。有2層意思,第一層,每一行都要有主鍵(單獨資訊或組合資訊),這個容易理解。第二層意思是非主鍵對主鍵依賴,如果是復合主鍵的情況,非主鍵屬性不能依賴於部分主鍵屬性。如 【產品,倉庫號,數量,倉庫位址,倉庫管理員】,這裡(產品+倉庫號)為復合主鍵,而倉庫位址和倉庫管理員依賴於倉庫號,這就是上面描述的「主鍵屬性不能依賴於部分主鍵屬性」,因此這是違背第二正規化的,符合正規化的設計應該為:【產品,倉庫號,數量】,【倉庫號,倉庫位址,倉庫管理員】。

第三正規化(3nf)

第三正規化的核心描述為:非主鍵屬性互不依賴。這個很容易理解,直接上例子:【學生編號,姓名,系編號,系辦公地點,系辦公**】,這裡學生編號是主鍵。然後這裡的非主鍵屬性系編號->系辦公室+系辦公**,這裡應該把該錶拆成2個表,然後外來鍵相連。符合正規化的設計應該為:【學生編號,姓名,系編號】和【系編號,系辦公地點,系辦公**】。

bc正規化(bcnf), 是兩個叫 raymond f. boyce 和 edgar f. codd 的總結出來的,取他們的姓拼成正規化名。bc 正規化是第三正規化的加強版。

第四正規化(4nf)

第四正規化的核心描述為:不允許冗餘的多對多關係。這個正規化的核心思想也是節省資料庫空間。舉例來說,【員工,技能,語言】,乙個員工能擁有多項技能和多種語言能力,而同一技能或語言可以有多個員工掌握。在這種情況下,依據第四正規化,我們應該把表單設計成【員工,技能】+【員工,語言】。在儲存時,我們能節省一些空間,但是在操作時,join 往往帶來更多的系統開支。

第五正規化(5nf)

第五正規化指在可能的前提下繼續打碎資料表。這個正規化和第四正規化的思想是相同的,希望消除冗餘,在可能的情況下,繼續打碎資訊。例如上面的例子,乙個三列的表,如果表的各列是兩兩之間多對多的關係,則按照第五正規化的思想,應該建立三張表,每張表有之前表的兩列資訊。

第六正規化(6nf)

第六正規化已經挺極端了,按文獻的說法,只有資料量大到資料倉儲級別,才有使用的必要。貌似是仔細設計表單的依賴關係和 join 關係的,就不仔細研究下去了。

在做資料庫設計的時候,滿足正規化要求的資料庫設計是結構清晰的,同時可避免資料冗餘和操作異常。一般情況下滿足第二和第三正規化就ok(第一正規化是預設滿足的),這並意味著不符合正規化要求的設計一定是錯誤的,這種較特殊的情況下,不符合正規化要求反而是合理的。

mysql資料庫的正規化 理解資料庫正規化

第一正規化 1nf 第一正規化的核心描述為 資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值。該正規化講的是列的原子性。有兩層意思 一層是說每一列只能存乙個屬性值 如果把2個屬性值存在1列中 第二層說的是在一張表中屬性值不能重複。在現代關係行資料庫中,都是預設滿足第一正規化的,所以你想...

資料庫正規化的理解

就是滿足了單一屬性不能再分割,正常情況下,你在資料庫裡建立的表肯定是滿足這個正規化的,要想不滿足這個正規化,可以在excel中嘗試合併單元格,拆分單元格體會下,就明白了。2nf 必須不存在非關鍵字段對組合的關鍵字段中的某些的依賴,比如某個表有 個關鍵字,但是它的非關鍵屬性 依賴第乙個關鍵字,非關鍵屬...

資料庫正規化的理解

資料庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型 實數 字元型 邏輯型 日期型等。在當前的任何關聯式資料庫管理系統 dbms 中,傻瓜也不可能做出不符合第一正規化的資料庫,因為這些dbms不允許你把資料庫表的一列再分成二列或多列。因此,你想在現有的dbms中設計出不符合...