在討論如何設(shè)計一個好的關(guān)系模式之前,我們先來了解一下設(shè)計不好的關(guān)系模式會出現(xiàn)什么問題。
假定有如下關(guān)系SCD:
SCD(Sno,Sname,Ssex,Sdept,Sdean,Cno,Cname,Grade)
其中,SCD表示學(xué)生關(guān)系,對應(yīng)的各屬性依次為學(xué)號、姓名、性別、院系、系主任、課程號、課程名稱和成績。關(guān)系的主碼為(Sno,Cno)。
這個關(guān)系模式存在如下問題。
1.?dāng)?shù)據(jù)冗余
當(dāng)一個學(xué)生選修多門課程就會出現(xiàn)數(shù)據(jù)冗余。假如某個學(xué)生(“2010050101”,“丁天波”,“男”,“管理學(xué)院”,“張勝”)共選了20門課程,則該學(xué)生的學(xué)號、姓名、性別、院系、系主任信息要重復(fù)存儲20次,如果全校有一萬名學(xué)生都要選修多門課程,則這樣的冗余就會造成大量的空間上的浪費。同時,同一門課程如果有多名學(xué)生選修,課程名稱要重復(fù)存儲多次,這樣進(jìn)一步增加了存儲空間的開銷。
2.更新異常
由于存在大量的數(shù)據(jù)冗余,當(dāng)更新數(shù)據(jù)庫中的數(shù)據(jù)時,系統(tǒng)要付出很大的代價來維護數(shù)據(jù)庫的完整性。否則會面臨數(shù)據(jù)不一致性的危險。例如,某院系要換系主任,或某門課程要修改名字,必須要修改每一個相關(guān)的元組,如果一部分修改了,而另外一部分未修改,則造成了數(shù)據(jù)的不一致性。
3.插入異常
如果剛開出一門課程,但是這樣的課程還沒有學(xué)生選修,則無法把課程信息插入到該數(shù)據(jù)庫中;如果一個學(xué)生剛剛?cè)雽W(xué),還沒有選修任何課程,則這樣的學(xué)生無法插入到該數(shù)據(jù)庫中;如果一個院系剛剛成立,還沒有招收任何學(xué)生,則這個院系信息也無法添加到數(shù)據(jù)庫中。
4.刪除異常
如果選修某門課程的學(xué)生都畢業(yè)了,在刪除學(xué)生信息時,則相關(guān)的課程信息業(yè)會跟著被刪除。
鑒于以上種種問題,可以得出結(jié)論:設(shè)計的該關(guān)系模式SCD并不是一個好的關(guān)系模式。一個好的關(guān)系模式應(yīng)該不會發(fā)生插入異常、刪除異常和更新異常,數(shù)據(jù)冗余也會降到最小。
一個關(guān)系模式之所以會產(chǎn)生上述問題,是由于關(guān)系模式中存在著不良的依賴關(guān)系引起的。
新聞熱點
疑難解答