2023年11月19日 10:32:53
關係模型的分解特性
關係的規範化 ^ - ^ 戳我跳轉至詳情^ - ^
前言:文章針對「資料庫的規範化」這一主題,從四個方面講述了相關概念,並提供了部分例項幫助大家理解。文章的重點還是——正規化,有相關資料庫理論基礎或實踐的讀者,可以跳過部分內容,直奔主題。
一、什麼是好的資料庫設計?
可以認為,好的資料庫設計,應該是規範的,規範的定義是什麼?
資料庫規範化,又稱正規化、標準化,是資料庫設計的一系列原理和技術,以減少資料庫中資料冗餘,增進資料的一致性。關係模型的發明者埃德加·科德最早提出正規化(normal form)這一概念,並於2023年代初定義了第一正規化、第二正規化和第三正規化的概念,還與raymond f. boyce於2023年共同定義了第三正規化的改進正規化——bc正規化。
除外還包括針對多值依賴的第四正規化,連線依賴的第五正規化、dk正規化和第六正規化。
現在資料庫設計最多滿足3nf,普遍認為正規化過高,雖然具有對資料關係更好的約束性,但也導致資料關係表增加而令資料庫io更易繁忙,原來交由資料庫處理的關係約束現更多在資料庫使用程式中完成。
以上摘自wiki百科,關於資料庫規範化的描述。官方的描述還是相當生硬的,但是是用簡短的話較為全面地進行了概括。簡單點說就是,通過使用不同層次的正規化,達到在資料庫設計中,減少資料冗餘,增進資料一致性的目的。
tips:實際應用開發中,基於業務和其他因素,如系統架構(資料庫架構)設計的需要等,普遍認為最多滿足3nf。通過適當的資料庫冗餘,提高相關業務的處理速度、使後端業務**更好設計、提高系統整體效能、滿足資料庫備份的需要、保障資料庫安全(異地多活、主備同步、分布式部署等)等。畢竟,實踐是檢驗真理的唯一標準,理論知識僅僅是實踐的參考和指導。
二、函式依賴理論
三、關係模型的分解特性
四、關係的規範化
^ - ^ ↑戳我返回目錄^ - ^
下圖是截至目前,有跡可循的正規化,按照最不規範——最規範排序。(unf->1nf->2nf……dknf->6nf)
最常用的是1nf、2nf、3nf、(bcnf),這3或4類,下面將通過定義、反例這樣的形式幫助大家理解這幾類正規化。
name
***age
class
idtim男20
一班610124199810202022
jerry男21
二班610124199710202100 學號
宿舍號住宿費用
001a
900002
b1500
003b
1500
學號確定宿舍、宿舍確定費用,且有學號不包含宿舍,宿舍不確定學號,符合傳遞函式依賴條件。
在以上關係r中,存在新增異常(新建個c宿舍,但是沒人住無法新增了)刪除異常(學生001退學了宿舍a也就刪除掉了)如果存在傳遞函式依賴,可以拆分為:
學號宿舍號
001a
002b
003b
宿舍號費用a
900b
1500
4.1 第一正規化(1nf): 列的原子性(同一列不能有多個值)
正例:表4.3——學生和課程的關係
name
course
jimhistory
jimmath
jimchinese
alice
english
tomhistory
tommath
反例1:單一字段存放了多個值,違反了1nf,jim現在到底上的哪門課呢?
**name
course
jimhistory,math,chinese
alice
english
tomhistory,math
反例2:多個字段表達同乙個意思,這也是不符合1nf的。
name
course1
course2
course3
jimhistory
math
chinese
alice
english
tomhistory
math
4.2 第二正規化(2nf):消除了非主屬性對於碼的部分函式依賴(滿足1nf且非主鍵列都完全函式依賴於主鍵)
通俗點講,①必須滿足1nf②必須有乙個主鍵,且沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴主鍵的一部分
舉個例子:
name
course
score
timchinese
70tim
math
90alice
chinese
80juliea
math
80在這張成績表中,首先滿足了1nf,列的原子性。其次,必須有主鍵,顯而易見,(name+course)才能唯一確定乙個元組,因此,name+course為聯合主鍵。score只有通過name+course才能共同確定,僅僅通過name或course是不行的。以y=f(x)為例,即,score=f(name+course),score不能只依賴name或course。
4.3 第三正規化(3nf):消除了非主屬性對於碼的傳遞函式依賴(滿足2nf且非主屬性列都不傳遞依賴於主鍵)
通俗點講,3nf必須滿足,①滿足2nf②不能有傳遞的依賴關係。換句話說,表中的每一列和主鍵直接相關,不能是間接相關的。再換句話說,通過主鍵就能直接定位到每一列,而不能是間接才能定位到
舉個例子:
訂單編號
訂單專案
客戶id
客戶名稱
001水果
101張三
002飲料
101張三
在這個表中,通過訂單編號能確定訂單專案名稱,如001能確定是水果;
通過訂單編號,能確定客戶id,通過客戶id能確定客戶名稱,當存在這種情況即存在傳遞依賴時,這個表就不滿足3nf了,需要拆分。
可以拆分為:
訂單編號
訂單專案
客戶id
001水果
101002
飲料101
客戶id
客戶名稱
101張三
4.4 bcnf:消除了主屬性對於碼的部分函式依賴和傳遞函式依賴(即滿足3nf,並且主屬性之間沒有依賴關係)
通俗點講,①滿足3nf②主屬性之間沒有依賴關係。
tips:
3nf和bcnf是在函式依賴的條件下對模式分解所能達到的最大程度。
3nf可能存在主屬性對鍵的部分依賴和傳遞依賴。
乙個模式中的關係模式如果都屬於bcnf,
那麼在函式依賴範圍內,已經實現了徹底的分離,已消除了插入異常和刪除異常。
後記:關於理論性、概念性知識,是比較抽象的,文章使用了學術定義結合通俗描述及例項的方法,講解了資料庫規範化相關知識,側重點是正規化,希望可以幫到各位讀者對概念的理解。
如在閱讀過程中檢查到錯、別字,或內容方面的錯誤,還請提出寶貴意見,以便修改。
資料庫規範化
規範化 normalization 是資料庫系統設計中非常重要的乙個技術。資料庫規範化能夠讓資料庫設計者更好地了解組織內部當前的資料結構,最終得到一系列的資料實體。資料庫規範化通過對資料庫表的設計,可以有效降低資料庫冗餘程度。在進行資料庫規範化的時候,我們有一系列的步驟需要遵循。我們把這些步驟稱作正...
資料庫規範化大全
er圖是一種關聯式資料庫邏輯設計的一種方法。normalization 正規化 是另一種 關係型資料庫的邏輯設計的方法。normal forms 正規化 1nf 2nf 3nf bcnf 4nf 5nf 1.不好的資料庫會出現的問題 a.修改異常 anomaly b.刪除異常 c.插入異常 d.資料...
資料庫規範化(二)
資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的 結構明晰的,同時,不會發生插入 insert 刪除 delete 和更新 update 操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。正規化說明 1.1 第一...