資料庫設計要注意什麼?

De_
6 min readOct 4, 2021

--

Photo by Kaleidico on Unsplash

文章大綱

  • 資料庫設計是什麼
  • 常見的資料庫設計方法
  • 設計資料庫時要注意的細節
  • 常見的資料庫設計方法

何謂資料庫設計?(Database Design)

它是一系列可以幫助你建立並且維護商業資訊的方法,讓你建造出一個有邏輯且好維護的資料庫系統。

好的資料庫設計旨在達成以下原則:

  1. 避免儲存多餘的資料

多餘或是不會用到的資訊就不要放到資料庫中,避免浪費空間或是增加資料出錯的機會。

2. 保持資料正確性

資料庫設計要注意的細節:

為了達成資料查詢的效能,資料庫的設計與優化非常重要,有些問題在資料庫規模小的時候可能沒有太大感受,不過一旦規模變大,效能差別會非常明顯,影響使用者體驗。下面列出常見的四個細節

  1. 能夠用數字型別的欄位就不要用字串型別

資料庫在處理字串比對的速度會比數字的判別來得慢,且字串所需要的儲存空間會大於數字,因此如果能使用數字就盡量使用數字型別

2. 避免將多種資訊儲存在同一個欄位

比方以地址來說就包含多種資訊:

  • 街道名稱
  • 城市
  • 國家
  • 巷弄

假設今天要進行使用者分析,想找尋位於「台中市」的所有使用者時,你必須要用LIKE或是部分字串比對的方式去查找,而這種尋找方式會耗費大量效能。

相對來說,如果把地址的資訊分散儲存,查詢上會更容易且未來在更新也更方便。

3. 索引(index)使用方式錯誤

索引就像是在一本書裡面放分類標籤一樣,可以讓你在查找時更加快速。在資料庫中,索引是一種資料結構,正確使用會加快查資料的速度

完全不用索引:資料量小的時候可能不會察覺速度差異,但隨著資料慢慢增長,會發現查找的速度也會跟著變慢,就像是一本字典裡沒有目錄一樣,查找需要每一頁都看過,耗費大量時間。

使用過多索引:使用索引可以有效加快讀取速度,但是反而會拖慢增刪改資料的速度,因為在修改資料時,索引也需要一併更新。

4. 命名方式不一致

資料庫設計一定會碰到命名,像是Table, Column等,不論採取什麼命名原則,很重要的一點就是要「一致」,比方大小寫、單複數、分隔符號、縮寫等。使用通用且一致的方式命名才能讓團隊容易理解使用,未來在維護上也更容易。

常見的資料庫設計方法:

  1. 正規化 (Normalization)

正規化也被稱為標準化,主要的目的是為了要避免儲存重複或是不必要的資料,同時增進資料庫的效能,藉由正規化,可以達成資料的一致性。

正規化主要包含以下三個階段:

1NF (First Normal Form): 去除關聯表中的重複值或複合屬性

  • 一個欄位只能有單一個值
  • 每個欄位都是唯一,不重複

NG 範例:成績這個欄位有一個以上的值

1NF

正確應該將每個值分開紀錄:

2NF (Second Normal Form): 讓每個關聯資料表只儲存同類的資料

  • 根據主鍵,將資料表拆成多張資料表

NG範例:

2NF

什麼樣的資料能稱為同類型的資料呢?最簡單的方式可以從主鍵作為區別,比方上述的表格中學號和課程編號的數值都是唯一,可以做為識別資料表的標示,因此可以做為主鍵,將上述資料表再分為學生和成績兩張表。

3NF (Third Normal Form):

如果某個欄位可以用其他欄位推斷出來,就需要再開一個表來紀錄

  • 移除遞迴相依的非主鍵屬性,讓所有非主鍵屬性都只相依於該表的主鍵,而且互不相依

從上述2NF中成績的資料表中可以發現,只要知道課程編號,就能夠推算出課程名稱是什麼,因此我們可以再分出一個表

3NF

表格分好以後就完成第三階段正規化,現在我們總共有三張表,學生、成績以及課程。

2. 實體關聯圖 (Entity-Relationship Diagram)

它可以被視為資料設計的草圖,把資料所需的屬性與資料之間的關聯性畫出來,以圖像的方式呈現抽象的資料設計,不僅在繪製過程能夠幫助仔細規劃,也更讓整個團隊知道如何從資料庫獲取資料,或是即時發現設計上的問題。

ERD

實體關聯圖主要包括三個元素:

  • 實體:它是指系統中可以被定義的事物或概念,比方評論、使用者等
  • 屬性:我們希望從實體中得到的資訊,比方以使用者的資料表來說,我們希望得到名字、性別跟電話
  • 關聯:描述不同實體之間的關聯性,比方一對多、多對一等。

線上好用的繪圖工具:

以上就是這次資料庫設計的分享內容,如果文章有任何心得反饋都歡迎留言告訴我!

參考資料

--

--

De_
De_

Written by De_

Who dares, wins. | Backend Engineer | Voracious Reader | Dog Person | Open to challenge

No responses yet