1
Hư ng d n th c hi n d ng chu n 3NF
Tác gi : Fred Coulson
Copyright © Fred Coulson 2007 (last revised November 18, 2007)
This tutorial may be freely copied and distributed, providing appropriate
attribution to the author is given.
Inquiries may be directed to http://phlonx.com/contact
http://phlonx.com/resources/nf3/
2
Mục lục
Mục lục...........................................................................................................................................................2
Về bản dịch....................................................................................................................................................3
Giới thiệu........................................................................................................................................................4
Bài toán: Quản lí Hóa đơn..............................................................................................................................5
Dạng chuẩn thứ 1 (1NF): Không có phần tử/nhóm phần tử lặp...................................................................7
Dạng chuẩn thứ 2 (2NF): Không có phụ thuộc hàm không đầy đủ vào khóa chính.....................................9
Dạng chuẩn thứ 2 (2NF): Pha thứ II.............................................................................................................13
Dạng chuẩn thứ 3 (3NF): Không có phụ thuộc hàm vào thuộc tính không khóa........................................16
Tham khảo...................................................................................................................................................18
3
Về bản dịch
Ngư i d ch: Phan Anh Vũ. L p ĐT12.K49. Trư ng ĐH Bách Khoa HN.
Email:
[email protected]
Website: http://cntt.tv
Xin giành b n d ch này t ng anh em l p ĐT12.K49 nói riêng, bà con khoa Đi n t Vi n
thông K49 trư ng ĐH Bách Khoa HN nói hơi riêng v i l i chúc anh em thi t t môn K
thu t ph n m m (thi l i t n 5k đ y). V i ai không ôn thi môn KTPM nhưng quan tâm và
bư c đ u tìm cách chu n hóa CSDL c a riêng mình, đây có l s là tài li u b t đ u t t
nh t.
Theo quan đi m c a tôi thì đây là m t tutorial r t thú v , đ c p đ n khá nhi u khía c nh
l t léo trong quá trình chu n hóa. Tuy nhiên b n d ch vì nhi u lí do (tôi đang ôn thi Tư
tư ng HCM l n 1 ch ng h n) nên ch t lư ng còn h n ch , mong nh n đư c góp ý đ
hoàn thi n d n.
C m ơn đ i ca Fred Coulson t t b ng đã đ ng ý cho d ch và phát tán tài li u này v i l i
h a s host b n d ch trên trang c a đ i ca. Chúc đ i ca s c kh e, ch p nhi u nh đ p
và vi t nhi u tutorial hay.
Còn bây gi , nào mình cùng đi xe buýt, nào mình cùng đi thi nhé …
4
Giới thiệu
Đây là m t hư ng d n r t ng n g n giành cho nh ng ngư i m i b t đ u bư c vào lĩnh
v c chu n hóa cơ s d li u. Vì r t khó đ di n t b ng l i nên tôi dùng nhi u nh t có
th các hình nh, bi u đ .
Đ trình bày các qui t c chính trong quá trình chu n hóa, tôi d a theo ví d c đi n v
Hóa đơn (Invoice) và chu n hóa nó v d ng 3NF (Third Normal Form). Trong quá trình
đó, chúng ta s hình thành Sơ đ liên k t th c th (Entity Relationship Diagram - ERD)
cho cơ s d li u.
Chú ý: Đây không ph i là hư ng d n chi ti t đ thi t k và th c thi m t cơ s d li u
th c t . B n không ph i làm theo tuy t đ i như các hình minh h a vì nó ch minh h a
cho vi c các d li u thô đư c s p x p l i như th nào trong quá trình chu n hóa.
Có th có ngư i không thích cách đó. Tôi cũng không trình bày các v n đ liên quan
đ n đi m l i, h i c a vi c chu n hóa. Ai quan tâm đ n các ch đ đó, xin xem danh
sách tham kh o cu i tài li u này.
Thư ng thì khi ai đó b t tay vào thi t k CSDL, trong đ u anh/cô ta đã có m t mô hình
chu n hóa ph n nào r i – chu n hóa là m t cách t nhiên đ nh n ra m i quan h c a
d li u và không c n ki n th c đ c bi t v toán h c, t p h p … Trong th c t , nhi u
khi còn ph i “phi chu n hóa” (de-normalize) CSDL – nhưng v n đ này n m ngoài n i
dung bài vi t.
Đ b t đ u: Trư c tiên, xin nh n m lòng 3 qui t c sau v các d ng chu n. Nh trư c,
b n s hi u sau:
1. Không có ph n t /nhóm các ph n t l p.
2. Không có ph thu c hàm không đ y đ vào khóa ng c .
3. Không có ph thu c hàm vào các thu c tính không khóa.
5
Bài toán: Quản lí Hóa đơn
Cho m u hóa đơn như Hình A).
Hình A: Hóa đơn
Đây là m u hóa đơn quen thu c trong kinh doanh. T t c các thông tin trên đó đ u
quan tr ng. Chúng ta đưa các thông tin đó vào CSDL như th nào đây?
Ai đó chưa bi t v CSDL quan h có th đưa các thông tin đó vào spreadsheet trong
Excel như sau:
Hình A-1: B ng hóa đơn
Không t i! Bàng này ghi l i t t c các đơn hàng đư c mua b i t t c các khách hàng.
Nhưng đi u gì x y ra n u ta mu n l y các thông tin ph c t p như:
• Có bao nhiêu 3" Red Freens mà Freens R Us đ t trong năm 2002?
6
•
•
T ng s 56" Blue Freens đư c bán Texas?
Nh ng s n ph m nào đư c bán vào ngày 14 tháng 7 năm 2003?
B ng trên càng nhi u thông tin thì vi c tr l i các câu h i trên càng khó khăn. Trong n
l c đưa d li u v tr ng thái mong mu n đ tr l i các câu h i ki u như trên, chúng ta
đang b t đ u vi c chu n hóa CSDL (normalization).
7
Dạng chu n thứ 1 (1NF): Không có phần tử/nhóm phần tử lặp
Nhìn vào hàng 2, 3, 4 c a b ng trong Hình A-1, ta th y t t c các d li u liên quan đ n
m t hóa đơn (Invoice #125). Theo thu t ng CSDL, nhóm các hàng này đư c g i là
m t hàng đơn CSDL (a single database row). M t hàng đơn CSDL đây đư c t o b i
ba hàng trong b ng Hình A-1.
D ng chu n 1NF mu n chúng ta tri t tiêu các ph n t l p. Chúng là các ph n t nào?
M t l n n a, đ ý hóa đơn đ u tiên (#125) trong Hình A-1. Ô H2, H3, và H4 ch a m t
danh sách các s Item ID. Đây là m t c t trong hàng CSDL đ u tiên c a chúng ta.
Tương t , I2-I4 hình thành m t c t khác; tương t v i J2-J4, K2-K4, L2-L4, và M2-M4.
Các c t trong CSDL thư ng đư c g i là thu c tính (attributes) (hàng/c t có cách g i
khác là b /thu c tính).
Đ ý th y các c t này ch a danh sách các giá tr . Rõ ràng là các danh sách như th vi
ph m lu t chu n 1NF: 1NF không cho phép danh sách hay chu i giá tr như v y t n t i
trong m t c t CSDL. 1NF đòi h i tính nguyên t - t c là s không th phân chia m t
thu c tính thành các ph n nh hơn.
Vì th chúng ta c n ph i lo i b s l p l i thông tin v item trong hàng giành cho Hóa
đơn #125. Trong Hình A-1, đó là các ô sau:
• T H2 đ n M2
• T H3 đ n M3
• T H4 đ n M4
Tương t , chúng ta cũng th y hi n tư ng trùng l p d li u trong hàng giành cho Hóa
đơn #126. Chúng ta có th chu n hóa sang d ng 1NF đ đ t đư c tính nguyên t m t
cách d dàng như sau – cho m i item m t hàng riêng bi t (thư ng g i là cách làm
ph ng).
Hình A-2: làm ph ng b ng d li u
Có th có ai đó ph n đ i: Chúng ta đang c g ng làm gi m s trùng l p d li u, nhưng
đây th m chí chúng ta đang làm ngư c l i! D li u v Khách hàng b trùng l p!
Xin đ ng lo l ng v đi u đó. S trùng l p đó s đư c gi i quy t khi chúng ta đi t i d ng
chu n 3NF. Xin hãy kiên nh n; đây là m t bư c chúng ta c n ph i đi qua đ đ n k t
qu cu i cùng.
8
Đ n đây chúng ta m i ch đi đư c m t n a ch ng đư ng đ đ t đư c d ng chu n
1NF. D ng chu n 1NF gi i quy t 2 v n đ :
1. M i hàng ph i không ch a nhóm l p (Tính nguyên t ).
2. M i hàng ph i có m t thu c tính nh n d ng duy nh t (Khóa chính)
Chúng ta đã gi i quy t xong tính nguyên t . Đ gi i quy t v n đ Khóa Chinh, chúng ta
c n ph i chuy n toàn b d li u sang m t h qu n tr CSDL quan h (RDBMS). đây,
tôi dùng Microsoft Access đ t o b ng orders như Hình B:
Hình B: B ng orders
B ng này cũng khá gi ng b ng trong Excel nhưng đi m khác là trong RDBMS, chúng ta
có th t o m t khóa chính. Khóa chính là m t c t (ho c nhóm c t) giúp xác đ nh duy
nh t m t hàng. Như nhìn th y trong hình B, không có m t c t đơn nào có th dùng đ
xác đ nh duy nh t các hàng. Tuy nhiên, n u chúng ta k t h p 2 c t order_id và item_id
thì đư c: không có hai hàng nào có giá tr order_id và item_id gi ng nhau. Vì th , k
h p hai c t đó v i nhau, chúng ta có khóa chính c a b ng Orders. Chúng ta g i hai c t
đó là khóa g p (concatened key).
M t giá tr , giúp xác đ nh
duy nh t m t hàng g i là
khóa chính.
Khi giá tr đó đư c t o b i
hơn m t c t thì ta g i chúng
là concatenated primary key.
C u trúc c a b ng Order có th đư c
bi u di n trong Hình C bên:
Hai thu c tính hình thành nên khóa chính
đư c kí hi u PK. Hình C cũng chính là
Lư c đ liên k t th c th
(Entity Relationship Diagram - or ERD).
CSDL c a chúng ta bây gi đã th a mãn hai
yêu c u c a 1NF: tính nguyên t
và tính duy nh t. Đó là hai đi u ki n cơ b n
nh t c a CSDL quan h .
Ti p theo là gì?
9
Dạng chu n thứ 2 (2NF): Không có phụ thuộc hàm không đầy đủ vào khóa
chính.
B y gi , chúng ta tìm các ph thu c hàm không đ y đ vào khóa chính đ lo i b
chúng. V i các b ng có khóa chính đư c t o b i hơn m t thu c tính, các thu c tính
không n m trong khóa chính ph i ph thu c hàm đ y đ vào khóa chính mà không
đư c phép t n t i các thu c tính ch ph thu c vào m t ph n c a khóa chính. N u có
thu c tính nào ch ph thu c m t ph n vào khóa chính thì b ng đó chưa đ t d ng
chu n 2NF.
Đ hi u rõ, chúng ta xem xét t ng thu c tính c a b ng Orders. V i m i thu c tính,
chúng ta s đ t câu h i: Li u thu c tính này có th t n t i mà không c n m t hay nhi u
thu c tính nào đó n m trong khóa chính không? N u câu tr l i là “có” – dù ch m t –
thì b ng chưa đ t chu n 2NF.
Xem l i Hình C bên đ nh l i c u trúc b ng.
Đ u tiên, nh c l i ý nghĩa c a hai thu c tính làm
nên khóa chính:
• order_id xác đ nh duy nh t m t hóa đơn.
• item_id xác đ nh duy nh t m t item trong kho.
Đây có th là mã s c a linh ki n, mã s hàng
trong kho, s SKU, sô UPC, …
Chúng ta s không phân tích hai thu c tính đó (vì
chúng là thành ph n c a khóa chính). Bây gi , ta
s xem xét các thu c tính còn l i.
order_date là ngày l p hóa đơn. Rõ ràng là thu c tính
này ph thu c vào order_id; ngày l p hóa đơn thì
ph i liên quan đ n hóa đơn, n u không nó ch là m t
ngày bình thư ng. Nhưng ngày l p hóa đơn có th t n t i mà không c n item_id?
Câu tr l i đơn gi n là có th : ngày hóa đơn ch ph thu c vào order_id, không ph
thu c vào item_id. M t s có th ph n đ i, cho r ng làm như th t c là có th t o ra
m t hóa đơn mà không có item nào (m t hóa đơn r ng). Nhưng đó không ph i là v n
đ c a chúng ta. Chúng ta đang xem xét đây là li u m t hóa đơn nào đó, l p vào m t
ngày nào đó có ph thu c vào m t item nào đó không? Rõ ràng là không. V n đ làm
sao đ không t n t i hóa đơn r ng là m t “qui t c nghi p v ” (business rule) đư c th c
hi n, ki m tra m chương trình; đó không ph i v n đ mà chu n hóa gi i quy t.
Như v y, order_date không th a mãn d ng chu n 2NF.
Do đó, b ng Orders không đ t 2NF. Bây gi hãy xem xét các thu c tính còn l i. Chúng
ta c n tìm t t c các thu c tính không th a mãn 2NF đ x lí.
10
customer_id là s ID c a khách hàng. Nó có ph thu c vào order_id? Không: m t
khách hàng có th t n t i mà không c n mua hàng. Nó có ph thu c vào item_id?
Không: v i cùng lí do. Đây là m t đi u thú v : customer_id (cùng v i các thu c tính
customer_* khác) không ph thu c vào customer_id l n order_id, t c là không ph
thu c vào b t c thu c tính nào c a khóa chính). Chúng ta s làm gì v i chúng? Chúng
ta ch quan tâm t i chúng khi xem xét d ng chu n 3NF. Bây gi chúng ta đánh d u
chúng là “không rõ ràng” (unknown). ?
item_description là miêu t v hàng hóa. Rõ rang là nó ph thu c vào item_id. Nhưng
nó có th t n t i mà không c n order_id? Có! M t item có th t n t i trong kho mãi
mãi, mà không bao gi đư c bán … Nó đ c l p v i hóa đơn. Như v y, item_description
không th a đi u ki n c a 2NF.
item_qty là s lư ng m t m t hàng đư c yêu c u trong m t hóa đơn. Rõ rang thu c
tính này ph thu c vào c hai thu c tính c a khóa chính. Chúng ta ch có th nói “5 cái
máy tính” hay “6 cái TV” ch không th nói “10 cái không gì c ” (ít nh t là trong thi t k
CSDL). S lư ng m t hàng hóa đư c yêu c u trong m t hóa đơn không th t n t i
không có hóa đơn. Như v y thu c tính này th a mãn 2NF.
item_price tương t
như item_description. Nó ch ph thu c vào item_id mà không
ph thu c vào order_id, nên nó không th a mãn 2NF.
item_total_price hơi đ c bi t. M t m t, nó có v như ph thu c vào c order_id l n
item_id, t c là th a mãn 2NF. M t khác, nó là m t giá tr rút ra t item_qty và
item_price. Chúng ta s x lí th nào? Trong th c t , trư ng này không liên quan đ n
CSDL c a chúng ta. Nó có th d dàng đư c t o ra ben ngoài CSDL; thêm nó vào
CSDL s gây dư th a. Do đó chúng ta s b nó đi.
order_total_price, là t ng t t c các item_total_price l i là m t giá tr rút ra n a nên
chúng ta s b thu c tính này.
Đây là b ng phân tích 2NF c a chúng ta:
Chúng ta s làm gì v i m t b ng không th a
mãn 2NF như th ?
Trư c tiên, l y ra n a sau c a khóa chính
(item_id) và đưa nó vào m t b ng khác.
Các thu c tính khác ph thu c vào item_id – đ y
đ ho c không đ y đ - cũng đưa luôn vào b ng
m i này. Chúng ta s g i b ng m i này là
order_items (xem Hình D).
Edited by Foxit Reader
Copyright(C) by Foxit Software Company,2005-2008
For
11 Evaluation Only.
Các thu c tính còn l i – g m các thu c tính ch ph thu c vào n a đ u c a khóa chính
(order_id) và các thu c tính chưa xác đ nh – gi nguyên.
Hình D: Bàng orders và b ng m i: order_items
Có m t vài đi m c n chú ý:
1. Chúng ta ph i đưa thu c tính order_id vào b ng order_items (đ xác đ nh xem
m i order_item thu c v order nào.
2. B ng orders có ít thu c tính hơn trư c.
3. Khóa chính c a b ng orders ch g m m t thu c tính: order_id.
4. Khóa chính c a b ng order_items g m hai thu c tính.
Sau đây là c u trúc các b ng (Hình E):
Hình E: C u trúc b ng orders và order_items table
N u b n chưa quen đ c Lư c đ liên k t th c th thì
xin đ ý vào đư ng n i gi a hai b ng. Đư ng n i này
12
có nghĩa là:
• M i order có th có m t ho c nhi u order-item,
nhưng ph i có ít nh t m t;
• M i order-item có th thu c v m t và ch m t order.
13
Dạng chu n thứ 2 (2NF): Pha thứ II
N u b n nghĩ r ng chúng ta đã đ t chu n 2NF thì ch đã, v n còn!
Nh r ng d ng chu n 2NF áp d ng cho các b ng có khóa chính h p thành b i hơn
m t thu c tính. Bây gi b ng orders có khóa chính là khóa đơn, b ng này đã d t d ng
chu n 2NF. Xin chúc m ng!
Tuy nhiên, bây gi , b ng order_items l i có khóa chính t o b i hai thu c tính. Chúng
ta l i ph i phân tích xem nó đã đ t 2NF chưa. Chúng ta l i làm theo cách cũ, v i m i
thu c tính, đ t ra câu h i: Li u thu c tính này có th t n t i mà không c n m t hay
nhi u thu c tính nào đó n m trong khóa chính không?
Bên c nh là Hình F, bi u di n c u trúc c a b ng
order_items. Bây gi chúng ta l n lư t xem xét
các thu c tính không khóa.
item_description ph thu c vào item_id, nhưng
không ph thu c vào order_id. Do đó, thu c tính
này không đ t chu n 2NF (ng c nhiên?)
item_qty ph thu c vào c hai thu c tính c a khóa chính nên thu c tính này th a mãn
chu n 2NF.
item_price ch ph thu c vào item_id mà không ph thu c vào order_id, nên nó vi
ph m đi u ki n c a chu n 2NF.
Chúng ta có b ng phân tích như sau:
Bây gi , chúng ta l y ra các thu c tính không th a mãn đi u ki n c a chu n 2NF và
đưa vào m t b ng m i. Chúng ta g i b ng m i này là b ng items:
Hình G: B ng order_items và b ng items
14
Khoan đã, có gì đó không n. Lúc trư c, sau khi ki m tra các đi u ki n c a chu n 2NF,
chúng ta l y ra t t c các thu c tính ph thu c vào item_id và đưa vào m t b ng m i.
L n này, chúng ta l i l y ra các thu c tính không đ t chu n 2NF: nói cách khác, gi a
nguyên item_qty. T i sao? L n này có gì khác mà l i làm như v y?
Đi m khác nhau là ch : trong l n trư c, chúng ta đưa thu c tính khóa item_id ra kh i
b ng orders, là do quan h m t-nhi u gi a orders và order-items. Do đó, thu c tính
item_qty ph i đi cùng item_id vào b ng m i.
L n này, item_id không đư c đưa ra kh i b ng order_items là do quan h nhi u-m t
gi a order-items và items. Do đó, vì item_qty không vi ph m chu n 2NF nên nó đư c
gi l i b ng có khóa chính g m hai thu c tính.
Đ hi u rõ hơn, có th xem ERD m i:
Hình H:
Đư ng n i gi a b ng items và b ng order_items nghĩa là:
• M i item có th n m trong m t s hóa đơn ho c không n m trong hóa đơn nào.
• M i order-item có th liên quan đ n m t và ch m t item.
Hai quan h trên là ví d cho quan h m t-nhi u. Ba b ng này, xem xét m t cách toàn
di n, là cách chúng ta bi u di n quan h nhi u-nhi u: M t order nào đó có th có nhi u
item; m t item nào đó có th thu c v nhi u order.
Nh r ng l n này, chúng ta không đưa thu c tính khóa order_id vào b ng m i. Lí do là
m i item c th , không c n ph i bi t nó thu c v order nào. B ng order_items lưu tr
15
nh ng thông tin dó thông qua hai thu c tính order_id và item_id. Hai thu c tính này khi
đ ng k t h p v i nhau thì t o thành khóa chính cho b ng order_items, nhưng khi đ ng
riêng r , chúng là các khóa ngo i (foreign keys) tr t i các hàng trong các b ng khác.
Chúng ta s nói nhi u hơn v khóa ngo i trong ph n 3NF.
Cũng chú ý r ng, b ng m i không có khóa chính h p thành b i nhi u thu c tính nên nó
th a mãn đi u ki n c a d ng chu n 2NF. Đ n đây, CSDL c a chúng ta đã đ t d ng
chu n 2NF!
16
Dạng chu n thứ 3 (3NF): Không có phụ thuộc hàm vào thuộc tính không
khóa.
Cu i cùng, chúng ta tr l i v n đ liên quan đ n thông tin v Khách hàng. V i CSDL
hi n t i, n u m t khách hàng có hơn m t order, chúng ta s ph i nh p thông tin v
khách hàng đó nhi u l n. X y ra hi n tư ng này là do trong b ng order có t n t i các
thu c tính ph thu c vào m t thu c tính không khóa.
Đ hi u rõ hơn khái ni m này, xem xét thu c tính order_date. Nó có th t n t i đ c l p
v i thu c tính order_id? Không: m t "order date" s là vô nghĩa n u không có order.
Khi đó, order_date đư c g i là ph thu c vào thu c tính khóa (vì order_id là m t thu c
tính khóa).
Còn thu c tính customer_name thì sao— li u nó có th t n t i m t mình bên ngoài
b ng orders? Có. V n có nghĩa khi nói v m t khách hàng mà không đ c p t i yêu
c u mua hàng hay hóa đơn. Tương t v i các thu c tính customer_address,
customer_city, và customer_state. B n thu c tính này ch ph thu c vào
customer_id – m t thu c tính không khóa.
Các trư ng này s thu c v m t b ng khác, c a riêng chúng, v i customer_id làm
khóa chính (xem Hình I).
Hình I:
Tuy nhiên, đ ý trong Hình I, chúng ta đã c t đ t m i quan h gi a b ng Orders v i các
thông tin v khách hàng. Do v y, chúng ta ph i khôi ph c m i quan h b ng cách t o ra
m t khóa ngo i (Foreign key - FK) trong b ng Orders. Khóa ngo i v b n ch t là m t
thu c tính tr t i khóa chính c a m t b ng khác. Hình J là ERD hoàn thi n c a chúng
ta:
17
Hình J: ERD hoàn ch nh
Quan h gi a orders và customers có th đư c di n gi i như sau:
• M t order đư c t o b i m t và ch m t customer;
• M t customer có th có nhi u order ho c không có order nào c .
Cu i cung, đây là d li u trong b n b ng c a chúng ta. Nh
không ph i tách hàng.
Hình K:
r ng, 3NF tách các c t,
18
Tham khảo
Sau đây là m t s tài li u tham kh o h u ích:
•
•
•
The Art of Analysis, by Dr. Art Langer, devotes considerable space to
normalization. Springer-Verlag Telos (January 15, 1997) ISBN: 0387949720
Báo cáo khoa h c năm 1969 c a Dr. Codd's v chu n hóa CSDL:
www.acm.org/classics/nov95
The Wikipedia article on normalization bàn v 5 d ng chu n hóa:
en.wikipedia.org/wiki/Database_normalization