資料庫中“資料冗餘”
阿新 • • 發佈:2019-01-04
資料冗餘
1.關係資料庫的資料冗餘形成的原因:表的重複、屬性的重複、元組的重複、屬性值的重複。有的資料冗餘用於資料間建立聯絡、資料安全或為了資料使用的便利,是必需的資料冗餘,而其餘的資料冗餘為非必需的資料冗餘應儘量予以消除。按屬性值域集合基的特點將其分為有限類和無限類。無限類屬性值偶爾重複不是資料冗餘,有限類屬性值的重複由一對多或多對多的關係所致,可相機處理之。關係資料庫中的資料冗餘主要是指關係資料庫中同一資訊資料的重複存貯。
資料冗餘浪費了寶貴的資源,應儘量減少。但關係資料庫中為實現一些功能有些資料冗餘是必需的。必需的資料冗餘主要用於以下用途:
(1)資料間建立聯絡,如兩表間通過共同屬性建立聯絡;
(2)資料恢復,如建立備份檔案以備正式檔案被破壞時恢復;
(3)資料核查,如設立資料校驗位可以檢查資料在存貯、傳輸等過程中的改變;
(4)資料使用的便利,如為了檢視資料的直觀,使用資料的方便、高效。
(5)減少資料通訊開銷,如分散式資料庫在不同場地重複。
2. 資料冗餘的成因
2.1 表的重複
為了資料安全的需要製作備份表,當主表被破壞時可用此恢復資料。分散式資料庫為減少資料通訊開銷也常重複放表,這種資料冗餘在這裡是必需資料冗餘,不能刪除。若是因其他原因產生的非必要的重複表則應予以刪除。
2.2 屬性重複
有不同表的屬性重複和同一表內屬性重複2種情況:
(1) 不同表中屬性重複常用來建立表之間聯絡,這隻需要一個公共屬性,這是必需資料冗餘,不能刪除;各表間的多於一個的屬性應當刪除。如有以下3個表:
T1(A,B,C);T2(A,B,D);T3(A,C,D,E)。
其中屬性A為三表所共有;屬性B為T1,T2 兩張表所共有,屬性C為T1,T3 兩張表所共有;屬性D為T2,T3 二表所共有。如取A為公共屬性則,T1,T2 兩張表中只能保留一個B屬性;T1,T3 兩張表中只能保留一個C屬性;T2,T3 兩張表中只能保留一個D屬性。
(2) 同一表內有相同屬性內容的多個屬性,若非資料安全檢查的需要,應刪除之。
2.3 元組的重複
表內不同記錄內容有時會完全相同,若非必要,應予以刪除。
2.4 屬性值的重複
按屬性值域集合基的特點可以將其分為有限類和無限類。
(1) 無限類屬性值的重複。無限類屬性值是指其屬性值域集合的基為無限大或者資料庫記錄數為同一數量級的屬性值,如實數、整數、日期、各種編號。
無限類屬性值偶爾也可能重複,但這只是巧合,而並非資料冗餘。
(2) 有限類屬性值的重複。有限類屬性值是指其屬性值域集合的基小於資料庫記錄數至少一個數量級的屬性值,如產品名,部門名,職稱名,課程名。
有限類屬性值的重複實際上是由一對多或多對多的關係引起的,有時可作為必需冗餘資料不予以處理,這時不需程式就有較好的檢視效果和工作效率。但當重複量很大時,也應當設法對所引起的資料冗餘進行壓縮,這通常要建立新表和相應的程式。
2.5 不同成因的資料冗餘用不同層次上的操作來消除。
(1)消除表的重複所引起的資料冗餘為磁碟檔案級的操作。
(2)屬性的重複所引起的資料冗餘的消除為對資料庫結構修改的操作。
(3)元組的重複所引起的資料冗餘的消除由記錄級的操作完成。
3. 資料冗餘的缺點:
a) 儲存空間的浪費。b) 資料互動和資料庫訪問執行效率降低。
程式碼的冗餘 可以用儲存過程來解決
刪除冗餘資料:用一個PL/SQL 方案(一個自定義的儲存過程)或者一個SQL語句的解決方案(使用一個分析的函式RANK()和一個巢狀的子查詢)來消除冗餘資料然後控制應該保留的記錄,詳細見參考資料2
減少冗餘資料:使用正規化設計。
常見型別資料庫設計技巧、模型,詳見參考資料3
附:
1. 題外:資料庫的最初雛形據說源自美國一個奶牛場的記賬薄(紙質的,由此可見,資料庫並不一定是儲存在電腦裡的資料^_^),裡面記錄的是該奶牛場的收支賬目,程式設計師在將其整理、錄入到電腦中時從中受到啟發。當按照規定好的資料結構所採集到的資料量大到一定程度後,出於程式執行效率的考慮,程式設計師將其中的檢索、更新維護等功能分離出來,做成單獨呼叫的模組,這個模組後來就慢慢發展、演變成現在我們所接觸到的資料庫管理系統(DBMS)——程式開發中的一個重要分支。
2. 資料庫正規化設計:
資料庫正規化是資料庫設計中必不可少的知識,沒有對正規化的理解,就無法設計出高效率、優雅的資料庫,甚至設計出錯誤的資料庫。
a) 第一正規化(1NF):屬性不可分
b) 第二正規化(2NF):符合1NF,並且,非主屬性完全依賴於碼。
c) 第三正規化(3NF):符合2NF,並且,消除傳遞依賴
d) BC正規化(BCNF):符合3NF,並且,主屬性不依賴於主屬性(如果關係模式屬於第一正規化,且每個屬性都不傳遞依賴於鍵碼,則R屬於BC正規化)。
參考資料: