要說資料庫什么最抽象,我覺得就是這個三范式,不是很好理解,但是表在設計的時候又必須要知道這么一個規則,
首先使用最簡潔的話說說這三范式:
第一范式(1NF:The First Normal Form):每一列不能再分割,
第二范式(2NF:The Second Normal Form):滿足1NF條件下,每一列非主鍵列要完全依賴主鍵,不能只依賴聯合主鍵中的一部分(因為主鍵可能是聯合主鍵,有多列的,必須所有欄位都用上 )
第三范式(3NF:The Third Normal Form):滿足2NF條件下,非主鍵的列不能依賴于非主鍵的列;
看到這三句話肯定不理解,于是,我們用圖來理解一下
1.第一范式
簡單的來說就是不能建立下面這樣的表,可以看到地址這一列是可以分割的;
一般只要是關系型資料庫建立的表都會滿足第一范式的,

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

注意上面這個表中的姓名,它只是依賴學號的,根據學號就可以找對唯一對應的姓名,所以這時非主鍵列 “姓名” 部分依賴于聯合主鍵“學號,科目”,不是完全依賴,所以不滿足第二范式;
我們需要將姓名這一列給提取出來,下表所示,對于完全依賴主鍵的放在一張表中,展示依賴一部分主鍵的放在另外一張表中;

3.第三范式
什么叫做非主鍵列不能依賴非主鍵列呢?看著就看不懂...
不要急,我們再看一張表:

我們可以知道系名可以依賴學號,畢竟一個學生肯定對應著唯一的系,但是系主任呢?系主任肯定是依賴于系名的,不可能依賴某個學生吧,所以有這樣的一個依賴關系:學號->系名->系主任,系主任間接依賴于主鍵,這是不滿足第三范式的;
所以我們需要將系主任給拿出來,單獨弄一張表:

以上就是我對三范式的理解,看了一些視頻和找了一些博客總結一下的吧,其實可以使用更加專業的話來說三范式的,有興趣的可以看看這個老哥的博客,傳送門╮(╯_╰)╭ ,這個就比較專業了,哈哈
4.反三范式
按理來說按照三范式設計資料庫之后,可以避免冗余資料,使得資料庫結構很精簡;但是有時這樣的設計會使得查詢表的時候需要進行關聯查詢,比如上面說第二范式的時候,姓名那里就不需要單獨弄張表出來;
單獨弄張表出來,如果有個需求要查詢一個學生的名字,科目和分數,你就需要關聯查詢一下;但是不單獨弄張表出來,你只需要查詢一次就夠了;
所以適當的冗余資料是可以接受的,而且可以提高查詢效率,不應該為了遵守三范式而創建設計表,應該衡量自己專案的實際需要,在三范式和反三范式之間做權衡,
我這里也就是大概講了一下我的理解,肯定有的地方不是很正確,哈哈哈,實際的專案中表肯定是非常復雜的,那就要多分析了╮(╯_╰)╭
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/249325.html
標籤:Java
上一篇:java8函式式編程
