1. 程式人生 > >資料庫三正規化簡單理解

資料庫三正規化簡單理解

資料庫設計當中三正規化是經常遇到的,如果實際專案資料庫設計中能達到第三正規化基本也就滿足要求了,那麼如何快速有效的理解三個正規化,同時應用於實際專案中去呢?

首先看看標準定義的三個正規化:

第一正規化(1NF)

所謂第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化(1NF)中表的每一行只包含一個例項的資訊。

在任何一個關係資料庫中,第一正規化(1NF)是對關係模式的基本要求,不滿足第一正規化(1NF)的資料庫就不是關係資料庫。

我的理解:列不可分。

第二正規化(2NF)

第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。第二正規化(2NF)要求資料庫表中的每個例項或行必須可以被惟一的區分。為實現區分通常需要為表加上一個列,以儲存各個例項的惟一標識。要求實體的屬性完全依賴於主關鍵字。

我的理解:不能部分依賴。即:一張表存在組合主鍵時,其他非主鍵欄位不能部分依賴。

第三正規化(3NF)

 滿足第三正規化(3NF)必須先滿足第二正規化(2NF)。簡而言之,第三正規化(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字資訊。

在第二正規化的基礎上,資料表中如果不存在非關鍵欄位對任一候選關鍵欄位的傳遞函式依賴則符合第三正規化。

我的理解:不能存在傳遞依賴。即:除主鍵外,其他欄位必須依賴主鍵。

官方標準的定義,我個人感覺說得非常術語化,比較難以理解消化。我簡單的理解為三句話,非常簡短,比較好理解。如果各位路過朋友們,有更好理解的總結,請不吝指出!

二,,

1.第一正規化(確保每列保持原子性)

第一正規化是最基本的正規化。如果資料庫表中的所有欄位值都是不可分解的原子值,就說明該資料庫表滿足了第一正規化。

第一正規化的合理遵循需要根據系統的實際需求來定。比如某些資料庫系統中需要用到“地址”這個屬性,本來直接將“地址”屬性設計成一個數據庫表的欄位就行。但是如果系統經常會訪問“地址”屬性中的“城市”部分,那麼就非要將“地址”這個屬性重新拆分為省份、城市、詳細地址等多個部分進行儲存,這樣在對地址中某一部分操作的時候將非常方便。這樣設計才算滿足了資料庫的第一正規化,如下表所示。

上表所示的使用者資訊遵循了第一正規化的要求,這樣在對使用者使用城市進行分類的時候就非常方便,也提高了資料庫的效能。

2.第二正規化(確保表中的每列都和主鍵相關)

第二正規化在第一正規化的基礎之上更進一層。第二正規化需要確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能儲存一種資料,不可以把多種資料儲存在同一張資料庫表中。

比如要設計一個訂單資訊表,因為訂單中可能會有多種商品,所以要將訂單編號和商品編號作為資料庫表的聯合主鍵,如下表所示。

 訂單資訊表

這樣就產生一個問題:這個表中是以訂單編號和商品編號作為聯合主鍵。這樣在該表中商品名稱、單位、商品價格等資訊不與該表的主鍵相關,而僅僅是與商品編號相關。所以在這裡違反了第二正規化的設計原則。

而如果把這個訂單資訊表進行拆分,把商品資訊分離到另一個表中,把訂單專案表也分離到另一個表中,就非常完美了。如下所示。

這樣設計,在很大程度上減小了資料庫的冗餘。如果要獲取訂單的商品資訊,使用商品編號到商品資訊表中查詢即可。

3.第三正規化(確保每列都和主鍵列直接相關,而不是間接相關)

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

比如在設計一個訂單資料表的時候,可以將客戶編號作為一個外來鍵和訂單表建立相應的關係。而不可以在訂單表中新增關於客戶其它資訊(比如姓名、所屬公司等)的欄位。如下面這兩個表所示的設計就是一個滿足第三正規化的資料庫表。

這樣在查詢訂單資訊的時候,就可以使用客戶編號來引用客戶資訊表中的記錄,也不必在訂單資訊表中多次輸入客戶資訊的內容,減小了資料冗餘。


三,,,

sql sever 中如何在兩個表之間建立參照關係
這個是通過建立一種稱為   “外來鍵”  的東西, 來建立  參照關係的。

例如:

1234567891011121314151617181920212223242526272829-- 建立測試主表. ID 是主鍵.CREATE TABLE test_main (id      INT   NOT <a href="https://www.baidu.com/s?wd=NULL&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dWPWczPH0vnhnYmW6vrHD40ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1DdnH0knjmsPWR3PHb4PWc3PW0" target="_blank" class="baidu-highlight">NULL</a>,value   <a href="https://www.baidu.com/s?wd=VARCHAR&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dWPWczPH0vnhnYmW6vrHD40ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1DdnH0knjmsPWR3PHb4PWc3PW0" target="_blank" class="baidu-highlight">VARCHAR</a>(10),PRIMARY <a href="https://www.baidu.com/s?wd=KEY&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dWPWczPH0vnhnYmW6vrHD40ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1DdnH0knjmsPWR3PHb4PWc3PW0" target="_blank" class="baidu-highlight">KEY</a>(id)  );-- 建立測試子表. CREATE TABLE test_sub (id      INT  NOT <a href="https://www.baidu.com/s?wd=NULL&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dWPWczPH0vnhnYmW6vrHD40ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1DdnH0knjmsPWR3PHb4PWc3PW0" target="_blank" class="baidu-highlight">NULL</a>,main_id INT ,value   <a href="https://www.baidu.com/s?wd=VARCHAR&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dWPWczPH0vnhnYmW6vrHD40ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1DdnH0knjmsPWR3PHb4PWc3PW0" target="_blank" class="baidu-highlight">VARCHAR</a>(10),PRIMARY <a href="https://www.baidu.com/s?wd=KEY&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dWPWczPH0vnhnYmW6vrHD40ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1DdnH0knjmsPWR3PHb4PWc3PW0" target="_blank" class="baidu-highlight">KEY</a>(id)  );-- 插入測試主表資料.INSERT INTO test_main(id, value) VALUES (1, 'ONE');INSERT INTO test_main(id, value) VALUES (2, 'TWO');-- 插入測試子表資料.INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');下面這個語句,  在  主表與子表之間, 建立一個關係ALTER TABLE test_sub ADD CONSTRAINT main_id_cons  FOREIGN <a href="https://www.baidu.com/s?wd=KEY&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dWPWczPH0vnhnYmW6vrHD40ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1DdnH0knjmsPWR3PHb4PWc3PW0" target="_blank" class="baidu-highlight">KEY</a> (main_id)  REFERENCES  test_main;

四,,舉個例子

請問,如何將如圖所示的這張資料庫表分割成符合第三正規化(3NF)的幾張表?

使用者,學院,專業,年級,班級
使用者(使用者編號userid,使用者名稱username,密碼password,性別sex,許可權authority,班級編號classid),主鍵是userid,外來鍵是classid
學院(學院編號collegeid,學院名稱college),主鍵是collegeid
專業(專業編號specialtyid,專業名稱specialty,方向direction,學院編號collegeid),主鍵是specialtyid,外來鍵是collegeid
年級(年級編號gradeid,年級名稱grade),主鍵是gradeid
班級(班級編號classid,班級名稱class,專業編號specialtyid,輔導員mother,班長monitor,年級編號gradeid),主鍵是classid,外來鍵是專業編號specialtyid,輔導員mother(參照userid),班長monitor(參照userid),年級編號gradeid

五,,,好處
資料庫的三正規化對資料庫來說是是具有一定好處的,先拋開定義不談,每當設計資料庫的時候,往往會具有較大的資料庫體系,也就是每個表之間的關係,不同表中某些屬性都具有一定的關係,因為具有關聯,所以資料在儲存的時候邏輯會比較複雜,如果不按照一定的規則來儲存資料就會有亂子,就像你開車一樣,沒有交通規則不就混亂了麼?因此,在資料庫設計的時候滿足正規化要求可以很大限度的合理的處理資料,減少資料的冗餘,即多餘的用資料,當然正規化的優點也不僅僅體現在這方面。
但換句話說,如果在某些特定的情況下還死死遵循正規化也是不可取的,因為可能降低資料庫的效率,資料庫的設計應該根據當前情況和需求做出靈活的處理。

相關推薦

資料庫正規化簡單理解

資料庫設計當中三正規化是經常遇到的,如果實際專案資料庫設計中能達到第三正規化基本也就滿足要求了,那麼如何快速有效的理解三個正規化,同時應用於實際專案中去呢?首先看看標準定義的三個正規化:第一正規化(1NF)所謂第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,

正規化-簡單理解

文章部分內容擷取自韓順平老師教學資料。 什麼樣的表才是符合3NF (正規化) 表的正規化,是首先符合1NF, 才能滿足2NF , 進一步滿足3NF   1NF: 即表的列的具有原子性,不可再分解,即列的資訊,不能分解, 只有資料庫是關係型資料庫(mysql/oracle

資料庫模型設計,第一正規化、第二正規化、第正規化簡單例子理解

資料庫設計一般滿足第三正規化就夠了 第一正規化(無重複的列) 定義:資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。如果實體中的某個屬性有多個值時,必須拆分為不同的屬性 通俗解釋:一個欄位只儲存一項資訊 eg:班級:高三年1班,應改為2個欄位,一個年級、一個班級,才滿足第一

資料庫正規化簡單理解

參考書籍:資料庫系統概論第四版-王珊、薩師煊資料庫正規化 正規化的級別       設計關係資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。       目前關係資料庫有六種正

資料庫設計之反正規化理解

反三正規化是基於第三正規化所調整的,沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,就必須降低正規化標準,適當保留冗餘資料。具體做法是: 在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加欄位,減少了查詢時的關聯,提高查詢效率,因為在資料

資料庫-正規化總結

【前言】 設計關係資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。 目前關係資料庫有六種正規化:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、巴斯-科德正規化(BCNF)、第四

資料庫正規化、事務、隔離級別

資料庫三正規化: 1NF:列不可再分(確保每一列的原子性); 2NF:行需要唯一區分(非鍵欄位必須依賴於鍵欄位); 3NF:非主屬性只依賴於主屬性,而不能依賴於其它非主屬性(除了主鍵以外的其它列都不傳遞依賴於主鍵列)。 事務        資料庫事務(Datab

資料庫正規化總結

資料庫三正規化:總結分享: 第一正規化: 關係模式R的每個關係r的屬性都是不可分的資料項(也就是每個屬性都是原子項、不可分割) 第二正規化: 屬於1NF,且非主屬性完全函式依賴於碼(表中的非

資料庫正規化(轉)

轉自:資料庫設計三大正規化 資料庫設計正規化 什麼是正規化:簡言之就是,資料庫設計對資料的儲存效能,還有開發人員對資料的操作都有莫大的關係。所以建立科學的,規範的的資料庫是需要滿足一些 規範的來優化資料資料儲存方式。在關係型資料庫中這些規範就可以稱為正規化。 什麼是三大正規化: 第一正規化:當關系模

第一正規化、第二正規化、第正規化理解

第一正規化(1NF): 1、每個屬性不可再分。 2、相近或一樣的屬性要儘量合併在一起確保不會產生冗餘資料。 上表如果要求把省/市單獨劃分出來,則不符合1NF。 上表產生資料冗餘。 2、第二正規化(2NF):非主屬性對關鍵字完全依賴,消除部分依賴。 比如有選

Java面試題之資料庫正規化是什麼?

什麼是正規化? 簡言之就是,資料庫設計對資料的儲存效能,還有開發人員對資料的操作都有莫大的關係。所以建立科學的,規範的的資料庫是需要滿足一些規範的來優化資料資料儲存方式。在關係型資料庫中這些規範就可以稱為正規化。   什麼是三大正規化? 第一正規化(1NF):強調的是列的原子性,即列不能夠

資料庫正規化和事物

資料庫設計正規化: https://www.cnblogs.com/knowledgesea/p/3667395.html和 https://www.cnblogs.com/wujianrui/p/7077864.html   資料庫事務的四大特性以及事務的隔離級別:

資料庫正規化

關係型資料庫設計是很重要的一門學科,設計的好壞與否,直接影響到後續業務效能。遵從資料庫方式進行資料庫設計,將極大程度上是的資料冗餘變少,後續整個資料庫的效能,維護與管理都將變得輕鬆。設計資料庫結構有六種正規化,而最常用的莫過於一二三正規化。本文將主要描述這三種正

關於資料庫三大正規化理解

三大正規化 1. 列不可分 列到底可不可分,和具體應用有關,不具有絕對性。在某應用中地址可能是不可分的,但在另外一個應用中可能會分為省份,城市,街道等等。 2. 消除部分依賴 假設 用大白話說,就是 對於單列主鍵,肯定不存在部分依賴,一

資料庫正規化經典例項解析

資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的、結構明晰的,同時,不會發生插入(insert)、刪除 (delete)和更新(update)操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。      設計正規化是不是很

資料庫正規化(NF)

資料庫在優化的時候我們主要通過四個方面進行考慮:     1.資料庫設計的合理性(多針對表結構的合理性)。     2、sql語句的結構優化    3、資料的配置(多針對快取而言,犧牲空間來換取時間)    4、在我們的硬體配置和作業系統的選擇上進行考慮。 今天主要介紹資料

資料庫正規化理解

1. 原始單據與實體之間的關係  可以是一對一、一對多、多對多的關係。在一般情況下,它們是一對一的關係:即一張原始單據對應且只對應一個實體。在特殊情況下,它們可能是一對多或多對一的關係,即一張原始單證對應多個實體,或多張原始單證對應一個實體。這裡的實體可以理解為基本表。明確這種對應關係後,對我們設計錄入介面大

資料庫正規化通俗說法,書上說的太蛋疼

簡單來說三句話: 1NF、列不可分; 2NF、不存在部分依賴; 3NF、不存在傳遞依賴。 解釋: 1NF:原子性,即欄位不可以再分。 2NF:唯一性,不可以把多種資料儲存在同一張表中,即一張表只

為什麼我不喜歡資料庫正規化

目錄 插曲 三正規化的定義 為什麼需要正規化 反正規化設計 插曲 最近,一個遠房親戚的小表弟準備選修專業 找到我問: "哥,現在學資料庫有沒有前途阿?" &

第一二正規化簡單理解

第一正規化 定義:第一正規化(無重複的列),資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。 通俗講就是:一個欄位只儲存一項資訊。 第二正規化 定義:第二正規化(屬性完全依賴於主鍵),滿足第一正規化前提,當一個主鍵由多個屬性共同組成時,才會發生不