第一正規化
维基百科,自由的百科全书
第一正規化 (1NF) 是資料庫正規化中所使用的一種正規形式。第一正規化是為了要排除 重複群 的出現,所採用的方法是要求資料庫的每個欄位都只能存放單一值,而且每筆記錄都要能利用一個惟一的主鍵來加以識別。
目录 |
[编辑] 不符合第一正規化的情況
[编辑] 重複群
重複群通常會出現在會計帳上,每一筆記錄可能有不定個數的值。舉例來說:
顧客 | 日期 | 數量 |
---|---|---|
Pete | Monday | 19.00
-28.20 |
Pete | Wednesday | -84.00 |
Sarah | Friday | 100.00
150.00 -40.00 |
'數量' 就是所謂的重複群了,而在這種情況下這份資料就不符合第一正規化。想要消除重複群的話,只要把每筆記錄都轉化為單一記錄即可:
交易 ID | 顧客 | 日期 | 數量 |
---|---|---|---|
1 | Pete | Monday | 19.00 |
2 | Pete | Monday | -28.20 |
3 | Pete | Wednesday | -84.00 |
4 | Sarah | Friday | 100.00 |
5 | Sarah | Friday | 150.00 |
6 | Sarah | Friday | -40.00 |
[编辑] 缺乏惟一識別碼
一樣是在交易這個例子中,同一天同一個人買了同樣的數量,這樣的交易做了兩次:
顧客 | 日期 | 數量 |
---|---|---|
Pete | Monday | 19.00 |
Pete | Monday | 19.00 |
如上所示,這兩筆交易可以說是一模一樣,也就是說如果只靠這些資料我們沒有辦法分辨這兩筆記錄。我們之所以說它不符合第一正規化,是因為上面這樣的表示法欠缺一個惟一識別碼,可以是一個欄位,也可以是一組欄位,而且可以保證在這個資料中惟一識別碼不會重複出現。要將它正規化到符合第一正規化的原則只需要加入一個惟一識別碼即可:
交易 ID | 顧客 | 日期 | 數量 |
---|---|---|---|
1 | Pete | Monday | 19.00 |
2 | Pete | Monday | 19.00 |
[编辑] 關聯式資料庫裡的第一正規化
大多數的 RDBMS (關聯式資料庫) 允許使用者在定義資料表的時候不去指定主鍵,不過這麼一來這種資料表就不符合第一正規化了。
從某個角度看來,不允許重複群的出現是關聯式資料庫表示資訊的方法,RDBMS 裡資料表每一筆記錄的每一個欄位都只能有一個值。舉例來說,如果定義了一個叫做 Favorite Number 的整數欄位,每一筆記錄的 Favorite Number 這個欄位都只會是一個整數 (或是無);這也就是說,如果設定了主鍵的話,理論上不可能會有任何關聯式資料庫的資料表會違反第一正規化的原則。
不過就算是在這種情況下,還是可以設計出在骨子裡違反第一正規化的資料表。最簡單的方法就是把多個有意義的值編碼過後存進一個欄位裡,然後在資料表中用很多欄位來表達同一個事實。
[编辑] 單一欄位中有多個有意義的值
在單一欄位中存放多個值是違反第一正規化的做法,下面這個就是很好的例子,它把多個值用逗號分開來表示:
人 | 不喜歡的食物 |
---|---|
Jim | Liver, Goat's cheese |
Alice | Broccoli |
Norman | Pheasant, Liver, Peas |
以這樣的設計看來,想要知道有什麼人不喜歡某樣特定的東西是很不容易的。不過可以把這個資料表轉化成下面這種符合第一正規化的型式:
人 | 不喜歡的食物 |
---|---|
Jim | Liver |
Jim | Goat's cheese |
Alice | Broccoli |
Norman | Pheasant |
Norman | Liver |
Norman | Peas |
[编辑] 用很多欄位來表達同一個事實
在同一個資料表裡用多個欄位來表達同一個事情也是違反第一正規化的:
人 | 喜歡的顏色 | 不喜歡的食物 (1) | 不喜歡的食物 (2) | 不喜歡的食物 (3) |
---|---|---|---|---|
Jim | Green | Liver | Goat's cheese | |
Alice | Fuchsia | Broccoli | ||
Norman | Blue | Pheasant | Liver | Peas |
Emily | Yellow |
就算我們能確定每個人不喜歡吃的食物最多不會超過三樣,這還是一個很糟的設計。舉例來說,我們想要知道所有不喜歡同一種食物的人的組合的話,這就不是件容易的事,因為食物有可能出現在任何一個欄位,也就是說每一次的查詢都要去檢查 9 (3 x 3) 組不同的欄位組合。
[编辑] 參考資料
- Attribute-value system
[编辑] 文獻
- Litt's Tips: Normalization
- Rules Of Data Normalization
- Date, C. J., & Lorentzos, N., & Darwen, H. (2002). Temporal Data & the Relational Model (1st ed.). Morgan Kaufmann. ISBN 1-55860-855-9.
- Date, C. J. (1999), An Introduction to Database Systems (8th ed.). Addison-Wesley Longman. ISBN 0-321-19784-4.
- Kent, W. (1983) A Simple Guide to Five Normal Forms in Relational Database Theory, Communications of the ACM, vol. 26, pp. 120-125
- Date, C.J., & Darwen, H., & Pascal, F. Database Debunkings
[编辑] 外部連結
- Database Normalization Basics by Mike Chapple (About.com)
- An Introduction to Database Normalization by Mike Hillyer.
- Normalization by ITS, University of Texas.
- Rules of Data Normalization by Data Model.org
- A tutorial on the first 3 normal forms by Fred Coulson
- Free PDF poster available by Marc Rettig
- Description of the database normalization basics by Microsoft
資料庫正規化 |
第一正規化 | 第二正規化 | 第三正規化 |