天天看點

資料庫設計之規範化和反規範化

文章目錄

    • 一、規範化
    • 二、反規範化

     資料庫設計的規範化能夠經常被提及,但是反規範化很少被涉獵。實際應用中反規範化應用的場景很多。本文主要介紹一下資料庫的反規範化。

一、規範化

常見的規範化有資料庫設計的三範式。

  • 1NF 是最低的規範化要求。如果關系 R 中所有屬性的值域都是簡單域,屬性不可再分。
  • 2NF 非主屬性完全函數依賴于碼
  • 3NF 非主屬性不傳遞依賴于任何一個候選碼

二、反規範化

    資料庫中的資料規範化的優點是減少了資料備援,節約了存儲空間,相應邏輯和實體的I/O 次數減少,同時加快了增、删、改的速度,但是對完全規範的資料庫查詢,通常需要更多的連接配接操作,進而影響查詢速度。是以,有時為了提高某些查詢或應用的性能而破壞規範規則,即反規範化(非規範化處理)。

常見的反規範化技術包括:

  • (1)增加備援列

    增加備援列是指在多個表中具有相同的列,它常用來在查詢時避免連接配接操作。例如:以規範化設計的理念,學生成績表中不需要字段“姓名”,因為“姓名”字段可以通過學号查詢到,但在反規範化設計中,會将“姓名”字段加入表中。這樣查詢一個學生的成績時,不需要與學生表進行連接配接操作,便可得到對應的“姓名”。

  • (2)增加派生列

    增加派生列指增加的列可以通過表中其他資料計算生成。它的作用是在查詢時減少計算量,進而加快查詢速度。例如:訂單表中,有商品号、商品單價、采購數量,我們需要訂單總價時,可以通過計算得到總價,是以規範化設計的理念是無須在訂單表中設計“訂單總價”字段。但反規範化則不這樣考慮,由于訂單總價在每次查詢都需要計算,這樣會占用系統大量資源,是以在此表中增加派生列“訂單總價”以提高查詢效率。

  • (3)重新組表

    重新組表指如果許多使用者需要檢視兩個表連接配接出來的結果資料,則把這兩個表重新組成一個表來減少連接配接而提高性能。

  • (4)分割表

    有時對表做分割可以提高性能。表分割有兩種方式。

    水準分割:根據一列或多列資料的值把資料行放到兩個獨立的表中。水準分割通常在下面的情況下使用。

    情況 1:表很大,分割後可以降低在查詢時需要讀的資料和索引的頁數,同時也降低了索引的層數,提高查詢效率。

    情況 2:表中的資料本來就有獨立性,例如表中分别記錄各個地區的資料或不同時期的資料,特别是有些資料常用,而另外一些資料不常用。

    情況 3:需要把資料存放到多個媒體上。

  • (5)垂直分割:把主碼和一些列放到一個表,然後把主碼和另外的列放到另一個表中。如果一個表中某些列常用,而另外一些列不常用,則可以采用垂直分割,另外垂直分割可以使得資料行變小,一個資料頁就能存放更多的資料,在查詢時就會減少 I/O 次數。其缺點是需要管理備援列,查詢所有資料需要連接配接操作。

END