軟體工程師的小事:到底要不要 Close

正規化設計之自我拿捏要領:以成本觀點 | 2019 鐵人賽

在資料表設計最經常性聽到的名詞就是正規化 常見的正規化名稱為

  • 「第一正規化」
  • 「第二正規化」
  • 「第三正規化」

正規化的執行步驟網路上的資訊很多就不在此描述

若無法記住各正規化的詳細描述與步驟
小弟在設計資料表時主要拿捏要領

  • 減少儲存成本
  • 增加效能:減少 I/O 成本 byte vs CHAR(10) 差了十倍

使用範例來解釋

非正規化(可優化)資料表

以訂單主資料表部分欄位為例

Order.OrderHeader
---------------------------
Id        OrderNo     Status
---------------------------
1        ORDER001    Processing
2        ORDER002    Finished
3        ORDER003    Cancelled
4        ORDER004    Finished
5        ORDER005    Processing

上每一筆資料列的最大儲存成本為

Orders.OrderHeader

INT + CHAR(8) + VARCHAR(10) = 4+8+12 = 24 (Byte)

正規化(優化)之後

Order.OrderStatus
--------------------------------
Id        Name
--------------------------------
1        Processing
2        Finished
3        Cancelled

Order.OrderHeader
--------------------------------
Id        OrderNo     StatusId
--------------------------------
1        ORDER001    1
2        ORDER002    2
3        ORDER003    3
4        ORDER004    2
5        ORDER005    1

每一筆資料列的最大儲存成本為

Order.OrderStatus

TINYINT + VARCHAR(10) = 1+12 = 13 (Byte)

Order.OrderHeader

INT + CHAR(8) + TINYINT = 4+8+1 = 13 (Byte)

可以發現 Order.OrderHeader 資料表的儲存成本降低了
當資料量越龐大的情況下
此設計所節省的儲存成本就會更明顯

透過正規化設計能夠有效的減少儲存成本
雖然儲存成本相較於記憶體或處理起來說是低廉

但是在存取成本上
從硬碟存取資料的成本
相較記憶體就高了許多

當然
必要時也得對資料表進行非正規化設計

留言

張貼留言