資料庫設計步驟


收集資料 , 建立表格 , 並進行正規化

資料之間的關係

(1) 一對一的對應 : 這種情況下 , 通常會將兩個 Table 合併成一個表格 .但若為了存取速度考量 ,
必要時也可拆成多個 Table .

(2) 一對多的對應 : 常見的例子是 "客戶資料" 與 "客戶訂單" , 一個客戶可以下很多筆定單 , 但一筆
定單只屬於一個客戶 , 在這種情況下會拆成兩個 Table , 然後以客戶編號做連結 .

客戶編號 客戶名稱 客戶地址 客戶電話
0001 ABC 臺中市 3399221

 

訂單編號 客戶編號 貨物編號 數量
2000040102 0001 00A0001-32 100
2000040103 0001 00A0001-33 120

(3) 多對多的對應 : 常見的例子是 "書籍資料" 與 "作者資料" , 一本書可以有很多個作者寫 ,
一個作者也可能寫很多本書 , 從兩個方向來看 , 都呈現一對多的對應 , 遇到這樣的情形 ,
通常會另外獨立一個 Table 出來 , 成為兩個一對多的對應 , 故會成為三個 Table

作者編號 作者姓名 作者地址 作者電話
A0001 咕咕 臺北市 2213399
A0002 噗噗 臺南市 8866231

合約編號 作者編號 書籍編號 有效期間
L20003210 A0002 2311754 2003/03/01
L20003211 A0001 2311754 2003/03/01
L20003212 A0002 2311755 2005/01/01

書籍編號 書籍名稱 書籍語文 書籍價格
2311755 噗噗熊養成手冊 中文 450
2311754 咕咕雞飼養手冊 中文 500

資料庫正規化

第 1 步: 每個 Table 給予一個 Primary Key ( Primary Key 可以是單一欄位或多欄位的組合 ) , 被設為
Primary Key 的欄位 , 其資料在 Table 中是唯一的 .

第 2 步: 把會出現多次同性質的資料欄位獨立成另一個 Table . ( 1NF ) 舉例而言 , 若某個 Table 形式為 :

書籍編號 書名 作者1 作者2
0001 咕咕雞飼養手冊 咕咕 噗噗

因為此 Table 中 , 作者1 與 作者2 是出現多次的同性質欄位 , 所以應該換成下列兩個 Table :

書籍編號 書名
0001 咕咕雞飼養手冊

書籍編號 作者
0001 咕咕
0001 噗噗


第 3 步: 檢查所有使用組合欄位的 Primary Key , Primary Key 中的每個欄位都要與 Table 中
    的其它欄位有直接相關性 , 沒有直接相關性的欄位要獨立成另一個 Table . ( 2NF )

舉例而言 , 若原來的表格為 :

作者編號 書籍編號 合約編號
A0002 2311754 20030312

若對一本書的每個作者都有一份合約 , 則此設計是合理的 . 但若是對一本書
的所有作者僅有一份合約 , 則此設計就不合理了 . 因此若是對一本書僅有一份合約 , 則應改成 :

書籍編號 合約編號
2311754 20030312

書籍編號 作者編號
2311754 A0002

第 4 步: 一個 Table 中 , 非 Primary Key 的欄位不應有從屬關係 . ( 3NF )

舉例而言 , 若原來的表格為 :

訂單編號 訂單內容 客戶名稱 客戶地址 客戶電話
0001 雜誌 咕咕 台北市 233997742

我們可以發覺 , 若 Primary Key 為訂單編號 . 則表格中的客戶名稱 , 客戶地址 , 客戶電話三個欄位
與訂單編號無直接相關 . 反而客戶名稱 , 客戶地址 , 客戶電話三個欄位息息相關 , 因此應分為 :

訂單編號 訂單內容 客戶編號
0001 雜誌 C0001

客戶編號 客戶名稱 客戶地址 客戶電話
C0001 咕咕 台北市 233997742

每個 Table 必須檢查的步驟

第 1 步: 每個 Table 必須有 Primary Key , 而 Primary Key 可以是一個或多個欄位的組合 .

第 2 步: 檢查每個表格中的每個欄位 , 注意是否需要設為 unique , 若要設為 unique index
    則最好欄位也設為 NOT NULL .

第 3 步: 檢查所有欄位長度是否適合 , 以及資料是否可以為 NULL .

第 4 步: 將常用的欄位建立 Index .

資料庫所有 Table 間必須檢查的步驟

第 1 步: 檢查多個 Table 代表相同資料的欄位 , 其欄位名稱或資料長度是否一致 . ( 必要時可
使用自訂型別 , 以確保資料長度在不同 Table 間都相同 )

填入資料 , 並加以測試

將常用的 SQL 敘述建立成 Store Procedure

請參考 資料庫SQL_Server進階概念

將複雜的 SQL 查詢建立成 View

請參考 資料庫SQL_Server進階概念

若 SQL 敘述會產生一致性的問題 , 則必須使用 Transaction

請參考 資料庫SQL_Server進階概念