1. 程式人生 > >求最小函式依賴集

求最小函式依賴集

步驟:

  1. 用分解的法則,使F中的任何一個函式依賴的右部僅含有一個屬性;
  2. 去掉多餘的函式依賴:從第一個函式依賴X→Y開始將其從F中去掉,然後在剩下的函式依賴中求X的閉包X(

     [Y1]閉包就是由一個屬性直接或間接推匯出的所有屬性的集合,例如:

    f={a->b,b->c,a->d,e->f}

    由a可直接得到b和d,間接得到c,則a的閉包就是{a,b,c,d}

    ) ,看X+是否包含Y,若是,則去掉X→Y;否則不能去掉,依次做下去。直到找不到冗餘的函式依賴;
  3. 去掉各依賴左部多餘的屬性。一個一個地檢查函式依賴左部非單個屬性的依賴。例如XY→A,若要判Y為多餘的,則以X→A代替XY→A是否等價?若A屬於(X)+,則Y是多餘屬性,可以去掉。

例子

例子1:

(1)判斷右邊是否最簡,得F={B->D,DG->C,BD->E,AG->B,ADG->B,ADG->C}

(2)第1步:

①假設B->D冗餘,則去掉B->D得:G={DG->C,BD->E,AG->B,ADG->B,ADG->C}

B+ =B 不包含D,所以不冗餘,不能去掉。

②假設DG->C冗餘,則去掉DG->C,得:G={B->D,BD->E,AG->B,ADG->B,ADG->C}

(DG)+ =DG不包含C,所以不冗餘,不能去掉。

③假設BD->E冗餘,則去掉BD->E,

得:G={B->D,DG->C,AG->B,ADG->B,ADG->C}

(BD)+ =BD不包含E,所以不冗餘,不能去掉。

④假設AG->B冗餘,則去掉AG->B,得:G={B->D,DG->C,BD->E,ADG->B,ADG->C},(AG)+ =AG不包含B,所以不冗餘,不能去掉。

⑤假設ADG->B冗餘,則去掉ADG->B,

得:G={B->D,DG->C,BD->E,AG->B,ADG->C}

(ADG)+ =ABCDG包含B,所以冗餘,去掉。

⑥假設ADG->C冗餘,則去掉ADG->C,得:G={B->D,DG->C,BD->E,AG->B}

(ADG)+ =ABCDG包含C,所以冗餘,去掉。

綜上:F={B->D,DG->C,BD->E,AG->B}

第2步:

①假設D->C冗餘,D+ =D不包含C,所以G不能去掉。

②假設G->C冗餘,G+ =G不包含C,所以D不能去掉。

③假設B->E冗餘,B+ =BD不包含E,所以D不能去掉。

④假設D->E冗餘,D+ =D不包含E,所以B不能去掉。

⑤假設A->B冗餘,A+ =A不包含B,所以G不能去掉。

⑥假設G->B冗餘,G+ =G不包含B,所以A不能去掉。

所以,Fm={B->D,DG->C,BD->E,AG->B}

例子2: