数据库冗余
數據冗余
1.關系數據庫的數據冗余形成的原因:表的重復、屬性的重復、元組的重復、屬性值的重復。有的數據冗余用于數據間建立聯系、數據安全或為了數據使用的便利,是必需的數據冗余,而其余的數據冗余為非必需的數據冗余應盡量予以消除。按屬性值域集合基的特點將其分為有限類和無限類。無限類屬性值偶爾重復不是數據冗余,有限類屬性值的重復由一對多或多對多的關系所致,可相機處理之。
關系數據庫中的數據冗余主要是指關系數據庫中同一信息數據的重復存貯。
數據冗余浪費了寶貴的資源,應盡量減少。但關系數據庫中為實現一些功能有些數據冗余是必需的。必需的數據冗余主要用于以下用途:
(1)數據間建立聯系,如兩表間通過共同屬性建立聯系;
(2)數據恢復,如建立備份文件以備正式文件被破壞時恢復;
(3)數據核查,如設立數據校驗位可以檢查數據在存貯、傳輸等過程中的改變;
(4)數據使用的便利,如為了查看數據的直觀,使用數據的方便、高效。
(5)減少數據通訊開銷,如分布式數據庫在不同場地重復。
關系數據庫由表及附屬文件組成,其表由屬性定義的結構和元組(記錄)組成,其屬性值域有多種類型,故關系數據庫的數據冗余形成的原因有表的重復、屬性的重復、元組的重復、屬性值的重復4類。
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
附:
數據庫范式是數據庫設計中必不可少的知識,沒有對范式的理解,就無法設計出高效率、優雅的數據庫,甚至設計出錯誤的數據庫。
a) 第一范式(1NF):屬性不可分
b) 第二范式(2NF):符合1NF,并且,非主屬性完全依賴于碼。
c) 第三范式(3NF):符合2NF,并且,消除傳遞依賴
d) BC范式(BCNF):符合3NF,并且,主屬性不依賴于主屬性(如果關系模式屬于第一范式,且每個屬性都不傳遞依賴于鍵碼,則R屬于BC范式)。
總結
- 上一篇: 敏涵控股集团成为2022第十二届公益节候
- 下一篇: SQL的DATEDIFF计算天数