資料之間的關係
(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 間都相同 )