如何求F-閉包、候選碼求解、範式判斷及BCNF分解


title: 關係數據庫設計(F+閉包、候選碼求解、範式判斷及BCNF分解)
date: 2018-11-12 21:46:32
tags: SQL
categories: 數據庫、SQL
這是基於github的個人博客:Josonlee’s Blog


F+閉包怎麼求

  • 第一步:設最終將成爲閉包的屬性集是Y,把Y初始化爲X;
  • 第二步:檢查F中的每一個函數依賴A→B,如果屬性集A中所有屬性均在Y中,而B中有的屬性不在Y中,則將其加入到Y中;
  • 第三步:重複第二步,直到沒有屬性可以添加到屬性集Y中爲止。 最後得到的Y就是X+

X是題目會給出的,求誰(即X)的閉包;Y是最後所求得的閉包

設關係R(A,B,C,D,E,G)有函數依賴集 F={AB→C,BC→AD,D→E,CG→B},求AB的閉包

X = {A、B} {A、B}+ = Y ={A、B、C、D、E}

由上可知,F邏輯蘊涵AB->D (因爲D被{A、B}+包含)

關係模式的候選碼怎麼求

候選碼:能唯一 完全函數依賴確定元組 的屬性(或屬性集合);候選碼的閉包是全集U,沒有冗雜

對應R< U、F>(U是屬性集,F是函數依賴集)

  • 如果有屬性不在F中出現,那麼它必須包含在候選碼中
  • 如果有屬性在所有函數依賴中一直存在於左邊,則它必包含在候選碼中;同理只在右邊出現過的屬性一定不屬於候選碼
  • 如果有屬性或屬性組能唯一標識元組,則它就是候選碼

先用前兩條,都不滿足就憑藉最後一條一個一個找

有時候選碼不止一個,都細分一下

範式判斷

  • 候選碼K:若K(屬性或屬性集合)可以完全函數依賴確定全部屬性U,則K就是候選碼
  • 主屬性:候選碼的子集
  • 1NF:【最基本的】 關係模式R的所有屬性 域都是原子的(不可分的)
  • 2NF:不存在非主屬性對候選碼部分函數依賴(也就是說非主屬性完全函數依賴於候選碼
  • 3NF:不存在非主屬性對候選碼傳遞依賴(第三範式又可描述爲:表中不存在可以確定其他非主屬性的非主屬性)
  • BCNF:只要屬性或屬性組A能夠決定任何一個屬性B,則A的子集中必須有候選鍵(F的左側包含超碼)

範式之間是包含關係,1NF>2NF>3NF>BCNF(這裏>表示包含)

數據庫設計三大範式與BCNF,學習筆記

分解成(無損連接的)BCNF範式

對於R<U、F>

  • 初始化 result={R}
  • 找到R中的一個模式S不屬於BCNF,且F+中存在一個 X->Y (Y不包含於X),X也不是S的候選碼,則S就能分解爲 {S1、S2}S1=XY,S2=(S-A)X ,用 {S1、S2} 代替result中的 {S}
  • 繼續執行上面這步直到result中所有關係模式都是BCNF

例:關係模式 R<U,F> ,其中 U={C,T,H,R,S,G}F={CS→G,C→T,TH→R,HR→C,HS→R},將其分解成BCNF並保持無損連接

在這裏插入圖片描述
圖片引用自:四、轉換成BCNF的保持無損連接的分解

例:關係模式R<U,F>,其中:U={A,B,C,D,E}F={A→C,C→D,B→C,DE→C,CE→A},將其分解成BCNF並保持無損連接。

result={ {A、C}、{B、D}、{A、B、E} }


這是基於github的個人博客:Josonlee’s Blog
更多SQL相關內容可在上面博客中找到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章