關係數據庫設計的規範化與非規範化之爭 - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- 關係數據庫設計的規範化與非規範化之爭 (http://www.webasp.net/article/22/21172.htm) |
| -- 作者:未知 -- 發佈日期: 2005-04-29 |
| 關係數據庫設計是對數據進行組織化和結構化的過程,核心問題是關係模型的設計。關係模型是數學化的、用二維表格數據描述各實體之間的聯繫的模型;它是所有的關係模式、屬性名和關鍵字的彙集,是關係模式描述的對象。關係模式是指一個關係的屬性名表,即二維表的表框架。關係模式的設計是關係模型設計的靈魂。所以,關係模式的設計是關係數據庫設計核心的核心。關係模式的設計直接決定著關係數據庫的性能。目前,在指導關係模式的設計中規範化(normalization)設計佔有主導地位,它是在數據庫幾十年的長期發展中產生並成熟的。但近年來這一領域出現了一種新的趨勢,一種稱為非規範化(denormalization)的關係模式設計引起業界的關注並已在一定的範圍內得到應用。對這一新的設計思想,各方反應迥異褒貶不一,從而在相關的理論界掀起了一場不大不小的規範化與非規範化之爭。本文簡單介紹了規範化與非規範化設計的基本思想,綜述了正反雙方爭論的要點,供國內業界相關人員參考。一、規範化設計關係模式規範化設計的基本思想是通過對關係模式進行分解,用一組等價的關係子模式來代替原有的關係模式,消除數據依賴(包括函數依賴和多值依賴)中不合理的部分,使得一個關係僅描述一個實體或者實體間的一種聯繫。這一過程必須在保證無損連接性、保持函數依賴性的前提下進行,即確保不破壞原有數據,並可將分解後的關係通過自然聯接恢復至原有關係。具體地說,規範化設計的過程就是按不同的範式,將一個二維表不斷地分解成多個二維表並建立表之間的關聯,最終達到一個表只描述一個實體或者實體間的一種聯繫的目標。目前遵循的主要範式包括1 NF、 2 NF、3 NF、BCNF、4NF和5NF等幾種;在工程中3NF、BCNF應用得最廣泛,推薦採用 3 NF作為標準。規範化設計的優點包括可有效地消除數據冗余,理順數據的從屬關係,保持數據庫的完整性,增強數據庫的穩定性、伸縮性、適應性。通常認為規範化設計存在的主要問題是增加了查詢時的連接庫表運算,導致計算機時間、空間、系統及運行效率的損失。在大多數情況下,這一問題可通過良好的索引設計等方法得到解決。二、非規範化設計非規範化設計的基本思想是,現實世界並不總是依從於某一完美的數學化的關係模式。強制性地對事物進行規範化設計,形式上顯得簡單化,內容上趨於複雜化,更重要的是導致數據庫運行效率的減低。非規範化要求適當地降低甚至拋棄關係模式的範式,不再要求一個表只描述一個實體或者實體間的一種聯繫。其主要目的在於提高數據庫的運行效率。非規範化處理的主要技術包括增加冗余或派生列,對表進行合併、分割或增加重複表。一般認為,在下列情況下可以考慮進行非規範化處理:(1)大量頻繁的查詢過程所涉及的表都需要進行連接;(2) 主要的應用程序在執行時要將表連接起來進行查詢;(3)對數據的計算需要臨時表或進行複雜的查詢。非規範化設計的主要優點是減少了查詢操作所需的連接;減少了外部鍵和索引的數量;可以預先進行統計計算,提高了查詢時的響應速度。非規範化存在的主要問題是增加了數據冗余;影響數據庫的完整性;降低了數據更新的速度;增加了存儲表所佔用的物理空間。其中最重要的是數據庫的完整性問題。這一問題一般可通過建立觸發器、應用事務邏輯、在適當的時間間隔運行批命令或存儲過程等方法得到解決。三、規範化與非規範化爭論的要點支持非規範化設計的一方認為,數據庫規範化的程度越高,其中表的數量越多,規範化程度與表的數量直接相關;表的數量越多,表的連接運算也越多;連接運算增多,必然降低數據庫執行的速度,影響數據庫的性能。只有通過非規範化設計,顯著減少表的數量,從而減少對連接運算的依賴,加速數據庫執行的速度,才能保證數據庫性能的正常發揮。例如目前流行於決策支持系統的非規範化星型模式就遠勝於應用規範化設計,是非規範化設計的最好範例。非規範化設計並不意味著混亂和無視規則,它也遵循保護信息完整性等軟件工程的基本原則。支持規範化設計的一方認為,規範化與非規範化只是一個邏輯概念,強調非規範化設計者混淆了邏輯與物理的關係。數據庫的性能是由物理水平決定的,即硬件、數據庫的大小和物理設計、數據存儲和訪問的方法、數據庫管理系統的優化程度、並發訪問的數量等;非規範化設計並未改變數據庫的物理水平,因此不可能提高數據庫的性能。規範化並不只是為了避免數據冗余,更重要的是為了確保數據庫的完整性。非規範化設計的最大問題是難以保證數據庫中數據的一致性,存在著破壞數據的危險。此外,非規範化使一個表中存在多個實體,不同實體混合在一起強化了數據庫的複雜性,提高了用戶理解的難度,並導致描述問題上的困難,增加了正確響應的風險。只有規範化設計才是解決這些問題的根本途徑。如果不摒棄非規範化設計理念,為了獲得所謂的性能的提高而漠視數據庫完整性被破壞的風險,就無法激勵開發商去研究真正的完全規範化而高性能的關係數據庫管理系統,其後果必然影響數據庫的健康發展。從某種意義上說,數據庫的規範化與非規範化設計並不是對立的、非此即彼的關係。也許其中一方會逐漸消亡,也許二者存在一條中間道路可走。認識事物原本存在一個螺旋式上升的過程。這場爭論尚未結束,也無法對最終的結果進行預測。但可以肯定的是,無論結果如何,都將對未來數據庫的發展方向產生深遠的影響。 |
| webasp.net |