(Mysql 八)資料表設計的三大正規化

2021-10-24 18:00:56 字數 2638 閱讀 8130

目錄

基礎知識:

一、第一正規化:每一列都是不可分割的原子資料項

存在問題:

二、第二正規化:在第一正規化的基礎上,非碼屬性必須完全依賴於碼

三、第三正規化:在第二正規化的基礎上,消除傳遞依賴

四、表與表之間的對應關係

1. 多對一 

2. 多對多

設計資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化。常用的有第一正規化,第二正規化,第三正規化,越高的正規化資料庫冗餘越小。

是不是感覺看不懂:下面介紹一下基礎知識

1.函式依賴:a-->b,如果通過a屬性(屬性組)的值,可以唯一確定b屬性的值,則稱b依賴於a。[屬性即資料表的列欄位]

如:學號--->姓名,(學號,課程名稱)--->分數

2.完全函式依賴:a--->b,如果a是乙個屬性組,則b屬性值的確定需要依賴於a屬性組中所有的屬性值。

如:(學號,課程名稱)--->分數

3.部分函式依賴:a--->b,如果a是乙個屬性組,則b屬性的確定只需依賴於a屬性組中的某一些值即可。

4.傳遞依賴:a-->b,b-->c,如果通過a屬性(屬性組)的值,可以確認唯一b屬性的值,再通過b屬性(屬性值)可以唯一確認c屬性的值,那麼c傳遞依賴於a。

5.碼:如果在一張表中,乙個屬性或屬性組,被其他所有屬性所完全依賴,則這個屬性(屬性組)為該錶的碼。

主屬性:碼屬性組中的所有屬性

由下表說明:

舉例說明:

在上面的表中,「家庭資訊」和「學校資訊」列均不滿足原子性的要求,故不滿足第一正規化,調整如下:

可見,調整後的每一列都是不可再分的,因此滿足第一正規化(1nf);

但是存在乙個問題就是,只滿足第一正規化的表很可能會存在資料冗餘,例如:

例如李白後來又讀了個博士,或者李白從研二公升到研三,然後表裡就會有不止一條李白的資料,這其實並不是也別好的設計。

即在第一正規化的基礎上,消除非主屬性對主碼的部分函式依賴。

第二正規化需要確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。

**********====

嚴格來說

主屬性:指主鍵列,即主鍵由一列構成

主鍵定義:能夠唯一標識乙個元組的屬性或屬性集,即可以由多列組成。

在教學中,大多例項都是主鍵由一列構成,所以也可以簡單地說主屬性與主鍵沒有什麼區別。

**********====

舉例說明:

在上圖所示的情況中,同乙個訂單中可能包含不同的產品,因此主鍵必須是「訂單號」和「產品號」聯合組成,

但可以發現,產品數量、產品折扣、產品**與「訂單號」和「產品號」都相關,但是訂單金額和訂單時間僅與「訂單號」相關,與「產品號」無關,

這樣就不滿足第二正規化的要求,調整如下,需分成兩個表:

第三正規化需要確保資料表中的每一列資料都和主鍵直接相關,而不能間接相關。

舉例說明:

上表中,所有屬性都完全依賴於學號,所以滿足第二正規化,但是「班主任性別」和「班主任年齡」直接依賴的是「班主任姓名」,

而不是主鍵「學號」,所以需做如下調整:

這樣以來,就滿足了第三正規化的要求。

上面說了三大正規化,有些正規化會給表分成兩個表或者多個表,那多表之間又是怎麼聯絡呢?

例如下述表,多個員工可以對應同乙個部門:

表與表之間通過外來鍵連線,在多的一方建立外來鍵,指向一的一方的主鍵。

例如學生表和課程表:

多對多的情況就需要建立第三張表作為中間表,然後表中的字段作為外來鍵,分別指向兩張表的主鍵

例子:

MySQL資料表設計,三大正規化

個人筆記,僅供參考 三大正規化即三個建立資料表的準則,根據自己的實際需求決定是否遵守即可 資料表中的所有欄位都是不可分割的原子值 例如乙個位址資訊,如果全部存在乙個欄位中就不符合第一正規化,需要把國家,省份這些資訊盡可能拆分到不同欄位才滿足。這樣可以方便以後檢索。舉例 create table st...

mysql筆記三 資料表三大設計正規化

1nf 資料表中的所有欄位都是不可分割的原子值 mysql create table student2 id int primary key,name varchar 20 address varchar 30 mysql insert into student2 values 1 張三 中國江蘇省...

資料表三大設計正規化

第一正規化 inf資料表中所有欄位都是不可分割的原子值 create table student2 id int primary key,name varchar 20 address varchar 30 insert into student2 values 1,li 四川省成都市武侯大道100...