資料庫三正規化和反三正規化

2022-02-09 13:18:23 字數 1744 閱讀 4235

要說資料庫什麼最抽象,我覺得就是這個三正規化,不是很好理解,但是表在設計的時候又必須要知道這麼乙個規則。

首先使用最簡潔的話說說這三正規化:

第一正規化(1nf:the first normal form):每一列不能再分割。

第二正規化(2nf:the second normal form):滿足1nf條件下,每一列非主鍵列要完全依賴主鍵,不能只依賴聯合主鍵中的一部分(因為主鍵可能是聯合主鍵,有多列的,必須所有欄位都用上 )

第三正規化(3nf:the third normal form):滿足2nf條件下,非主鍵的列不能依賴於非主鍵的列;

看到這三句話肯定不理解,於是,我們用圖來理解一下

1.第一正規化

簡單的來說就是不能建立下面這樣的表,可以看到位址這一列是可以分割的;

一般只要是關係型資料庫建立的表都會滿足第一正規化的。

2.第二正規化

看下面這個表,這裡聯合主鍵是(學號,科目),只有確定了這兩個值,才能確定其他的列;比如分數,如果只依賴學號,那麼當學號為1的時候,分數有兩個,不能唯一確定;如果只依賴科目,當科目為語文的時候,分數也對應有兩個;

注意上面這個表中的姓名,它只是依賴學號的,根據學號就可以找對唯一對應的姓名,所以這時非主鍵列 「姓名」部分依賴於聯合主鍵「學號,科目」,不是完全依賴,所以不滿足第二正規化;

我們需要將姓名這一列給提取出來,下表所示,對於完全依賴主鍵的放在一張表中,展示依賴一部分主鍵的放在另外一張表中;

3.第三正規化

什麼叫做非主鍵列不能依賴非主鍵列呢?看著就看不懂...

不要急,我們再看一張表:

我們可以知道系名可以依賴學號,畢竟乙個學生肯定對應著唯一的系,但是系主任呢?系主任肯定是依賴於系名的,不可能依賴某個學生吧,所以有這樣的乙個依賴關係:學號->系名->系主任,系主任間接依賴於主鍵,這是不滿足第三正規化的;

所以我們需要將系主任給拿出來,單獨弄一張表:

4.反三正規化

按理來說按照三正規化設計資料庫之後,可以避免冗餘資料,使得資料庫結構很精簡;但是有時這樣的設計會使得查詢表的時候需要進行關聯查詢,比如上面說第二正規化的時候,姓名那裡就不需要單獨弄張表出來;

單獨弄張表出來,如果有個需求要查詢乙個學生的名字,科目和分數,你就需要關聯查詢一下;但是不單獨弄張表出來,你只需要查詢一次就夠了;

所以適當的冗餘資料是可以接受的,而且可以提高查詢效率,不應該為了遵守三正規化而建立設計表,應該衡量自己專案的實際需要,在三正規化和反三正規化之間做權衡。

我這裡也就是大概講了一下我的理解,肯定有的地方不是很正確,哈哈哈,實際的專案中表肯定是非常複雜的,那就要多分析了╮(╯_╰)╭

mysql三正規化和反三正規化 資料庫三正規化和反三正規化

要說資料庫什麼最抽象,我覺得就是這個三正規化,不是很好理解,但是表在設計的時候又必須要知道這麼乙個規則。首先使用最簡潔的話說說這三正規化 第一正規化 1nf the first normal form 每一列不能再分割。第二正規化 2nf the second normal form 滿足1nf條件...

資料庫設計 三大正規化和反正規化

總共有六大正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 巴斯 科德正規化 bcnf 第四正規化 4nf 和第五正規化 5nf,又稱完美正規化 只記前三正規化 三大正規化 第一正規化 資料表中欄位滿足原子性,字段不可再分 如學生資訊字段 儲存 張三,手機號 這個可以再分姓名,手機...

資料庫反正規化 認識三大正規化

有時,理論與實踐有一些差距,在做乙個具體的事情時,我們應該以實際為核心,而不是把理論死搬上來,要 從實際出發 呵呵。在資料庫的世界裡存在著三大正規化,也就是規範,真正的關係型資料庫應該盡可能的滿足這些規範,但有時,我們卻根據實際問題,需要違背這些規範,這個系列我將從實際專案 發來與大家一起說說 反正...