數(shù)據(jù)庫(kù)筆記(補(bǔ)充)——分解算法淺析

寫在前面:今天筆者將會(huì)對(duì)BCNF和3NF分解算法做簡(jiǎn)要的分析拐揭,不過(guò)實(shí)際上大多數(shù)的分解用肉眼即可睡陪,以下分解算法不依賴于過(guò)多的條件可以直接講一個(gè)滿足1NF的模式分解為3NF或BCNF

BCNF 分解算法

  • 教材上關(guān)于BCNF分解算法的偽代碼實(shí)現(xiàn)有部分印錯(cuò)(本科教學(xué)版)
  • 該算法的結(jié)果是一個(gè)滿足BCNF的無(wú)損分解豹障,但可能不是保持依賴的(畢竟3NF是保持依賴并且可以滿足無(wú)損分解的最高范式)
  • 偽代碼實(shí)現(xiàn)

    對(duì)滿足1NF的模式R<U, F>作如下處理可分解成滿足BCNF范式的模式R1, R2, ..., Rn

    result := {R};
            done := false;
            計(jì)算F+;
            while(not done) do
                  if(result中存在模式Ri不屬于BCNF)
                  then begin
                          令 α→β 為一個(gè)在Ri上成立的非平凡函數(shù)依賴,滿足 α→β ∈ F+嚎京, 并且 α∩β  = ?;
                          result := (result - Ri) ∪ (Ri - β) ∪ (α, β)
                  end
                  else done := true        
    
  • 先來(lái)分析一波上面的代碼吧

    1. 首先令reslut = {R}
    2. 接著計(jì)算一下F的函數(shù)閉包F+(計(jì)算函數(shù)閉包還是挺麻煩的诚隙,所以在下面判斷的時(shí)候挑一個(gè)函數(shù)依賴,判斷一下是否被F邏輯蘊(yùn)含即可)
    3. 然后判斷結(jié)果集result中是否還存在哪個(gè)模式不滿足BCNF范式赎懦,如果都滿足雀鹃,則直接跳到步驟5,如果存在某個(gè)模式 Ri ∈ result励两,不滿足BCNF范式黎茎,則執(zhí)行步驟4
    4. 選擇一個(gè)在Ri上成立的非平凡函數(shù)依賴 α→β,并且 α→β 屬于 F+当悔,并且α∩β=?傅瞻。然后將模式Ri分解成兩個(gè)模式,分別為 (Ri - β) 和 (α, β)盲憎。并且將Ri從result中移除嗅骄,江新得到的兩個(gè)模式添加到result中。接著回到步驟3繼續(xù)判斷
    5. 分解完成饼疙,輸出結(jié)果
  • 紙上學(xué)來(lái)終覺(jué)淺溺森,讓我們拿教材上的栗子出來(lái)刷一刷~~

    • 有模式class<U, F>, 通過(guò)上述算法,對(duì)其進(jìn)行滿足BCNF范式的分解
      • U = {course_id, title, dept_name, credits. sec_id, semester, year, building, room_number, capticy, time_slot_id}
      • F = {
        course_id → (title, dept_name, credits),
        (building, room_number)→capaticy,
        (course_id, sec_id, semester, year)→(building, room_number, time_slot_id)
        }
    • 首先還是看一下上面模式的候選碼是什么吧(書上的栗子是直接給出來(lái)了宏多,但是有些題可能不給儿惫,需要自己算)
      • 通過(guò)上一篇博客講的候選碼求解算法,容易求得模式class的候選碼為{course_id, sec_id, semester, year}
    • 接著判斷模式class是否滿足BCNF范式
      • 模式R中存在依賴 course_id → (title, dept_name, credits), 但course_id并不是R的一個(gè)超碼伸但,故R不滿足BCNF范式
      • 對(duì)R做如下分解
        • course(course_id, title, dept_name, credits)
        • class_1(course_id, credits. sec_id, semester, year, building, room_number, capticy, time_slot_id)
    • 繼續(xù)判斷肾请,易知course是滿足BCNF范式的,而course_1同理不滿足BCNF范式更胖, 繼續(xù)分解
      • 找到非平凡依賴(building, room_number)→capaticy铛铁, 且其屬于F
      • 對(duì)class_1分解如下
        • classroom(building, room_number, capacity)
        • section(course_id, credits. sec_id, semester, year, building, room_number, time_slot_id)
    • 檢測(cè)一下發(fā)現(xiàn)現(xiàn)在模式classroom和section也滿足BCNF范式了
    • OK隔显,原來(lái)的模式class現(xiàn)在分解為如下三個(gè)模式
      • course(course_id, title, dept_name, credits)
      • classroom(building, room_number, capacity)
      • section(course_id, credits. sec_id, semester, year, building, room_number, time_slot_id)

3NF分解算法

以下分解算法中用到了正則覆蓋的概念,這個(gè)筆者在之前的博客中也提到過(guò)饵逐,點(diǎn)我傳送

  • 該分解算法可以保持依賴括眠,并且是無(wú)損分解
  • 偽代碼實(shí)現(xiàn)

     令Fc為F的正則覆蓋;
     i:= 0;
     for each Fc 中的函數(shù)依賴 α→β 
             i := i + 1
             Ri := αβ;
     if 模式 Rj, j = 1, 2, ..., i 都不包含R的候選碼
     then
             i := i + 1
             Ri := R的任意候選碼
     /*(以下代碼可選)用來(lái)移除冗余關(guān)系,如果沒(méi)有冗余關(guān)系則可以不care*/ 
     repeat
             if 模式 Rj包含于另一個(gè)模式Rk中
             then
                    /*刪除Rj*/
                    Rj := Ri
                     i := i - 1
     until 不再有可以刪除的Rj
     return (R1, R2, ..., Ri)
    
  • 老規(guī)矩倍权,還是先分析一下上面的偽代碼

    1. 首先求出F的正則覆蓋Fc(實(shí)際上就是利用Amstrong公式化簡(jiǎn)原來(lái)的函數(shù)依賴集的過(guò)程)
    2. 接著將Fc中的每一個(gè)函數(shù)依賴單獨(dú)分解成一個(gè)模式掷豺,得到一個(gè)模式列表S = {R1, R2, ..., Ri}
    3. 如果上述模式列表S中的任意一個(gè)模式包含模式R的候選碼,則跳到步驟5薄声,否則執(zhí)行步驟4
    4. 選取R的任意一個(gè)候選碼当船,組成一個(gè)新的模式R', 將R'添加到模式列表S中
    5. (可選)如果模式列表中存在冗余(即某個(gè)模式被其他模式包含),則可以刪除這個(gè)模式
    6. 輸出S
  • 講真默辨,3NF分解的步驟還是很簡(jiǎn)單的德频,主要還是計(jì)算一下F的正則覆蓋,詳細(xì)栗子就不舉了缩幸,下面簡(jiǎn)單提一提

    • 比如上面分析BCNF分解算法時(shí)用到的模式class壹置, 利用上述算法分解之后可以得到和 利用BCNF算法分解一樣的結(jié)果
    • 所以,神奇的事情發(fā)生了表谊,利用3NF分解算法得到的結(jié)果可能還會(huì)滿足BCNF范式
    • 實(shí)踐中BCNF分解的另一種途徑: 先用3NF算法分解钞护,然后對(duì)結(jié)果中不滿足BCNF范式的模式用BCNF分解算法分解,如果結(jié)果不保持依賴爆办,則回退回3NF
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末患亿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子押逼,更是在濱河造成了極大的恐慌,老刑警劉巖惦界,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挑格,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沾歪,警方通過(guò)查閱死者的電腦和手機(jī)漂彤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)灾搏,“玉大人挫望,你說(shuō)我怎么就攤上這事】褚ぃ” “怎么了媳板?”我有些...
    開(kāi)封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)泉哈。 經(jīng)常有香客問(wèn)我蛉幸,道長(zhǎng)破讨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任奕纫,我火速辦了婚禮提陶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匹层。我一直安慰自己隙笆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布升筏。 她就那樣靜靜地躺著撑柔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仰冠。 梳的紋絲不亂的頭發(fā)上乏冀,一...
    開(kāi)封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音洋只,去河邊找鬼辆沦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛识虚,可吹牛的內(nèi)容都是我干的肢扯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼担锤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔚晨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起肛循,我...
    開(kāi)封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铭腕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后多糠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體累舷,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年夹孔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了被盈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搭伤,死狀恐怖只怎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怜俐,我是刑警寧澤身堡,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站佑菩,受9級(jí)特大地震影響盾沫,放射性物質(zhì)發(fā)生泄漏裁赠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一赴精、第九天 我趴在偏房一處隱蔽的房頂上張望佩捞。 院中可真熱鬧,春花似錦蕾哟、人聲如沸一忱。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帘营。三九已至,卻和暖如春逐哈,著一層夾襖步出監(jiān)牢的瞬間芬迄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工昂秃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留禀梳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓肠骆,卻偏偏與公主長(zhǎng)得像算途,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚀腿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容