正規化的優缺點
簡而言之,規範化作為一種數據庫設計技術的主要優點和缺點是什麼?
用一些無組織數據的快照來回答這個問題可能更容易,作為一個具體的例子:
這是一篇 Microsoft 文章,它很好地解釋了規範化和不同的形式,儘管關於 Microsoft Access 有點過時,但理論和原則仍然適用。
簡而言之,數據庫規範化具有以下好處:
- 減少數據冗餘,從而提高可維護性。正如您在範例表中看到的那樣,不必要地重複了對銷售不重要
Customer_Sale
的事情。列就是一個很好的例子
ItemDesc
。想像一下過去一年的ItemNo = 123
銷售情況,例如成千上萬的銷售額。然後業務意識到這是錯誤的並且需要更新。使用目前將. _ _ _ _Customers``ItemDesc``ItemDesc``Customer_Sale``ItemDesc
規範化將是呼叫另一個表
Items
,該表將儲存每個唯一的一行,Item
並且是該表所在的位置ItemDesc
。該表的主鍵可能是ItemNo
(假設這是Item
此處的唯一標識符)。ItemNo = 123
因此,表中的ItemDesc
列將只有一條記錄Items
。該Customer_Sale
表將不再有一個名為的列ItemDesc
(您可以Items
通過加入ItemNo
兩個表中的欄位來在表中引用它)。現在,如果Item
需要更改對 an 的描述,您只需在一個地方更新它,即Items
表中的那一行。 2. 出於類似的原因,這將通過最大限度地減少上述維護類型所需的工作量來提高性能。更少的更新行通常意味著更短的鎖定時間和更少的鎖定升級機會(如果適用)。因此,總體而言,您的數據庫系統和使用它的應用程序將能夠更有效地執行。 3. 由於規範化,性能可能會提高的另一個原因是因為您的表(以及它們存在於磁碟上的對象 - 通常稱為數據頁)的數據大小變得更小。這有助於提高 SQL 引擎在從磁碟定位和載入這些數據頁時的性能,這通常是伺服器預配置硬體的最大瓶頸。由於您的表及其行的大小實際上變得更小,這意味著單個數據頁中可以容納更多行,這意味著需要定位並從磁碟載入的頁面也更少。 4. 從消費應用程序的角度來看,當您的數據庫架構被適當地規範化時,您通常也會獲得更大的靈活性。
通過將數據點的欄位分解為適當的不太寬的表,這對您的域模型具有一般意義,並將特定實體的密切相關欄位放在同一個表中,您可以最大限度地利用、查詢、並在您的消費應用程序中根據需要操作這些數據點和實體(在非常鬆散的意義上重構您的數據)。
再次使用您的表的一個範例
Customer_Sale
是,如果您有一個具有兩個螢幕的**銷售訂單應用程序。**一個是該Items
企業的唯一銷售清單及其描述,另一個是Customer_Sales
該企業迄今為止製作的清單。如果您沒有儲存該欄位的規範化 表(如我的第一點所舉例說明的那樣),那麼要同時支持這些螢幕及其案例,由於其數據,您將很難使用不太靈活的非規範化表資訊冗餘。
Items``ItemDesc
Customer_Sale``Items
當然,在您的消費程式語言中,您可以使用不同類型的運算符來轉換您的
Customer_Sale
表格數據以適應Items
可出售螢幕的模型,但這是消費應用程序每次都需要做的一組額外工作該螢幕已載入。管理程式碼也變得很冒險,特別是隨著時間的推移,更複雜的業務規則開始發揮作用,而不是表已經存在的規範化數據庫架構。Items
標準化的可能缺點是:
- 過度標準化會導致潛在的性能問題。通過將欄位分解成太多的表,它可能會使查詢過於復雜,這總是涉及將這些表中的大多數重新連接在一起以獲得您需要的行。一些數據庫系統在連接過多的情況下更加困難,但您的里程可能會有所不同。
- 在旨在支持繁重的OLAP(線上分析處理- 本質上是數據倉庫和繁重的報告目的)的數據庫結構中,有時通過將記憶體和預先計算的常用事實和數據保持在附近,****非規範化表的性能會更好。
我在此答案開頭連結的文章中未討論此答案中未討論的更深入和技術性的推理。因此,我強烈建議您在從該答案中獲得非常簡短的概述後通讀該文章。