在前面我們已經介紹了
屬性值的概念,我們說,它是「不可分的」。而第一正規化要求屬性也不可分。那麼它和屬性值不可分有什麼區別呢?給乙個例子:
name
address
age小明
山東省濟寧市
13小紅
遼寧省大連市
12表中的address屬性實際上的可分的
這種情況不滿足第一正規化。不滿足第一正規化的資料庫,不是關聯式資料庫!所以,我們在任何關聯式資料庫管理系統中,做不出這樣的「表」來。
聽起來好像很神秘,其實真的沒什麼。
一 個候選碼中的主屬性也可能是好幾個。如果乙個主屬性,它不能單獨做為乙個候選碼,那麼它也不能確定任何乙個非主屬性。給乙個反例:我們考慮乙個小學的教務管理系統,學生上課指定乙個老師,一本教材,乙個教室,乙個時間,大家都上課去吧,沒有問題。那麼資料庫怎麼設計?(學生上課表)
姓名課程
老師職稱
教材教室
時間小明
數學上老王
講師數學1
1208:00
乙個學生上一門課,一定在特定某個教室。所以有(學生,課程)->教室
乙個學生上一門課,一定是特定某個老師教。所以有(學生,課程)->老師
乙個學生上一門課,他老師的職稱可以確定。所以有(學生,課程)->老師職稱
乙個學生上一門課,一定是特定某個教材。所以有(學生,課程)->教材
乙個學生上一門課,一定在特定時間。所以有(學生,課程)->上課時間
因此(學生,課程)是乙個碼(聯合主鍵)。
然而,乙個課程,一定指定了某個教材,那麼就有課程->教材。(學生,課程)是個碼,課程卻決定了教材,這就叫做不完全依賴,或者說部分依賴。出現這樣的情況,就不滿足第二正規化!
不滿足第二正規化會產生以下問題:
1、要新增加一門課程叫「微積分」,教材是《大學數學》,怎麼辦?學生還沒選課,而學生又是主屬性,主屬性不能空,課程無法記錄(
插入異常)
2、下學期沒學生學數學1了,要學數學2,那麼表中將不存在課程數學上,也就沒了數學1。(
刪除異常)
3、若要更換課程教材,如果有10000人選課,則要修改10000條資料(修改異常)
解決方法:
將上面的表分成兩張表:
學生選課 姓名
課程老師
職稱教室
時間小明
數學上老王
講師120
8:00
課程表
課程教材
數學上數學1
上面的學生選課表符合第二正規化,但不符合第三正規化,原因就在於職稱這個屬性有傳遞依賴。
因為職稱不依賴與主鍵,而僅僅依賴於老師,而老師依賴於主鍵,這就產生的傳遞依賴。
這會產生以下問題:
1、老師公升級了,變教授了,要改資料庫,表中有n條,改了n次……(修改異常)
2、沒人選這個老師的課了,老師的職稱也沒了記錄……(刪除異常)
3、新來乙個老師,還沒分配教什麼課,他的職稱無法記錄?……(插入異常)
那應該怎麼解決呢?和上面一樣,再分成兩個表: 姓名
課程老師
教室時間
小明數學上
老王120
8:00
老師職稱
老王講師
資料庫設計之三大正規化
為了建立冗餘較小 結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。在實際開發中最為常見的設計正規化有三個 1 第一正規化 確保每列保持原子性 第一正規化是最基本的正規化...
資料庫設計之三大正規化
背景 表設計後,很可能結構不合理,出現資料重複儲存,簡稱資料的冗餘,這對資料的增刪改查帶來很多後患,所以我們需要審核是否合理,如何審核呢?需要一些有關資料庫設計的理論指導規則,這些規則業界簡稱資料庫的正規化。兩個重要概念 1 部分函式依賴 1 存在資料冗餘 2 新增資料會有異常 3 更新資料會有異常...
資料庫學習之 三大正規化
為什麼會出現三大正規化呢?什麼是三大正規化?首先我們需要來理解以下的基本概念 關係 資料庫中的一張二維表 資料依賴 資料間的相互關係 函式依賴 屬於資料依賴的乙個分支,前者資料值確定後,後者資料值唯一指定,也就是說後者資料的值依賴前者!例如 由於乙個學號只對應乙個學生,乙個學生只在乙個系,所以當學號...