Hướng dẫn thực hiện dạng chuẩn 3NF
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/ Mục lục Mục lục Về dịch Giới thiệu Bài tốn: Quản lí Hóa đơn Dạng chuẩn thứ (1NF): Khơng có phần tử/nhóm phần tử lặp Dạng chuẩn thứ (2NF): Khơng có phụ thuộc hàm khơng đầy đủ vào khóa Dạng chuẩn thứ (2NF): Pha thứ II 13 Dạng chuẩn thứ (3NF): Khơng có phụ thuộc hàm vào thuộc tính khơng khóa 16 Tham khảo 18 Về dịch Ngư i d ch: Phan Anh Vũ L p ĐT12.K49 Trư ng ĐH Bách Khoa HN Email: virces931511@yahoo.com Website: http://cntt.tv Xin giành b n d ch t ng anh em l p ĐT12.K49 nói riêng, bà khoa Đi n t Vi n thông K49 trư ng ĐH Bách Khoa HN nó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 không ôn thi môn KTPM quan tâm bư c đ u tìm cách chu n hóa CSDL c a riêng mình, có l s tài li u b t đ u t t nh t Theo quan m c a tơi m t tutorial r t thú v , đ c p đ n nhi u khía c nh l t léo q trình chu n hóa Tuy nhiên b n d ch nhi u lí (tơi ơn thi Tư tư ng HCM l n ch ng h n) nên ch t lư ng h n ch , mong nh n đư c góp ý đ hồn thi n d n C m ơn đ i ca Fred Coulson t t b ng đ ng ý cho d ch phát tán tài li u v i l i h a s host b n d ch trang c a đ i ca Chúc đ i ca s c kh e, ch p nhi u nh đ p vi t nhi u tutorial hay Còn bây gi , xe buýt, thi … Giới thiệu Đây 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 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 hình nh, bi u đ Đ trình bày qui t c q trình chu n hóa, tơi d a theo ví d c n v Hóa đơn (Invoice) chu n hóa v d ng 3NF (Third Normal Form) Trong q trình đó, s hình thành Sơ đ liên k t th c th (Entity Relationship Diagram - ERD) cho s d li u Chú ý: Đây không ph i hư ng d n chi ti t đ thi t k th c thi m t s d li u th c t B n không ph i làm theo t đ i hình minh h a ch minh h a cho vi c d li u thô đư c s p x p l i th trình chu n hóa Có th có ngư i khơng thích cách Tơi khơng trình bày v n đ liên quan đ n m l i, h i c a vi c chu n hóa Ai quan tâm đ n ch đ đó, xin xem danh sách tham kh o cu i tài li u Thư ng b t tay vào thi t k CSDL, đ u anh/cô ta có m t mơ hình chu n hóa ph n r i – chu n hóa m t cách t nhiên đ nh n m i quan h c a d li u 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 ph i “phi chu n hóa” (de-normalize) CSDL – v n đ n m n i dung vi t Đ b t đ u: Trư c tiên, xin nh n m lòng qui t c sau v d ng chu n Nh trư c, b n s hi u sau: Khơng có ph n t /nhóm ph n t l p Khơng có ph thu c hàm khơng đ y đ vào khóa ng c Khơng có ph thu c hàm vào thu c tính khơng khóa 5 Bài tốn: Quản lí Hóa đơn Cho m u hóa đơn Hình A) Hình A: Hóa đơn Đây m u hóa đơn quen thu c kinh doanh T t c thơng tin đ u quan tr ng Chúng ta đưa thơng tin vào CSDL th đây? Ai chưa bi t v CSDL quan h có th đưa thơng tin vào spreadsheet Excel sau: Hình A-1: B ng hóa đơn Không t i! Bàng ghi l i t t c đơn hàng đư c mua b i t t c khách hàng Nhưng u x y n u ta mu n l y thơng tin ph c t p như: • Có 3" Red Freens mà Freens R Us đ t năm 2002? • • T ng s 56" Blue Freens đư c bán Texas? Nh ng s n ph m đư c bán vào ngày 14 tháng năm 2003? B ng nhi u thơng tin vi c tr l i câu h i khó khăn Trong n l c đưa d li u v tr ng thái mong mu n đ tr l i câu h i ki u trên, b t đ u vi c chu n hóa CSDL (normalization) 7 Dạng chu n thứ (1NF): Khơng có phần tử/nhóm phần tử lặp Nhìn vào hàng 2, 3, c a b ng Hình A-1, ta th y t t c d li u liên quan đ n m t hóa đơn (Invoice #125) Theo thu t ng CSDL, nhóm hàng đư c g i m t hàng đơn CSDL (a single database row) M t hàng đơn CSDL đư c t o b i ba hàng b ng Hình A-1 D ng chu n 1NF mu n tri t tiêu ph n t l p Chúng ph n t nào? M t l n n a, đ ý hóa đơn đ u tiên (#125) Hình A-1 Ơ H2, H3, H4 ch a m t danh sách s Item ID Đây m t c t hàng CSDL đ u tiên c a 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, M2-M4 Các c t CSDL thư ng đư c g i thu c tính (attributes) (hàng/c t có cách g i khác b /thu c tính) Đ ý th y c t ch a danh sách giá tr Rõ ràng danh sách th vi ph m lu t chu n 1NF: 1NF không cho phép danh sách hay chu i giá tr v y t n t i m t c t CSDL 1NF địi h i tính ngun t - t c s không th phân chia m t thu c tính thành ph n nh Vì th c n ph i lo i b s l p l i thông tin v item hàng giành cho Hóa đơn #125 Trong Hình A-1, sau: • T H2 đ n M2 • T H3 đ n M3 • T H4 đ n M4 Tương t , th y hi n tư ng trùng l p d li u 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 sau – cho m i item m t hàng riêng bi t (thư ng g i cách làm ph ng) Hình A-2: làm ph ng b ng d li u Có th có ph n đ i: Chúng ta c g ng làm gi m s trùng l p d li u, th m chí 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 u S trùng l p s đư c gi i quy t t i d ng chu n 3NF Xin kiên nh n; m t bư c c n ph i qua đ đ n k t qu cu i 8 Đ n m i ch đư c m t n a ch ng đư ng đ đ t đư c d ng chu n 1NF D ng chu n 1NF gi i quy t v n đ : M i hàng ph i khơng ch a nhóm l p (Tính nguyên t ) M i hàng ph i có m t thu c tính nh n d ng 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, c n ph i chuy n toàn b d li u sang m t h qu n tr CSDL quan h (RDBMS) đây, dùng Microsoft Access đ t o b ng orders Hình B: Hình B: B ng orders B ng gi ng b ng Excel m khác RDBMS, có th t o m t khóa Khóa m t c t (ho c nhóm c t) giúp xác đ nh nh t m t hàng Như nhìn th y hình B, khơng có m t c t đơn có th dùng đ xác đ nh nh t hàng Tuy nhiên, n u k t h p c t order_id item_id đư c: khơng có hai hàng có giá tr order_id item_id gi ng Vì th , k h p hai c t v i nhau, có khóa c a b ng Orders Chúng ta g i hai c t khóa g p (concatened key) M t giá tr , giúp xác đ nh nh t m t hàng g i khóa Khi giá tr đư c t o b i m t c t ta g i chúng concatenated primary key C u trúc c a b ng Order có th đư c bi u di n Hình C bên: Hai thu c tính hình thành nên khóa đư c kí hi u PK Hình C Lư c đ liên k t th c th (Entity Relationship Diagram - or ERD) CSDL c a bây gi th a mãn hai yêu c u c a 1NF: tính nguyên t tính nh t Đó hai u ki n b n nh t c a CSDL quan h Ti p theo gì? Dạng chu n thứ (2NF): Khơng có phụ thuộc hàm khơng đầy đủ vào khóa B y gi , tìm ph thu c hàm khơng đ y đ vào khóa đ lo i b chúng V i b ng có khóa đư c t o b i m t thu c tính, thu c tính khơng n m khóa ph i ph thu c hàm đ y đ vào khóa mà khơng đư c phép t n t i thu c tính ch ph thu c vào m t ph n c a khóa N u có thu c tính ch ph thu c m t ph n vào khóa b ng chưa đ t d ng chu n 2NF Đ hi u rõ, xem xét t ng thu c tính c a b ng Orders V i m i thu c tính, s đ t câu h i: Li u thu c tính có th t n t i mà không c n m t hay nhi u thu c tính n m khóa khơng? N u câu tr l i “có” – dù ch m t – 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 nh t m t hóa đơn • item_id xác đ nh nh t m t item kho Đây có th mã s c a linh ki n, mã s hàng kho, s SKU, sô UPC, … Chúng ta s khơng phân tích hai thu c tính (vì chúng thành ph n c a khóa chính) Bây gi , ta s xem xét thu c tính cịn l i order_date ngày l p hóa đơn Rõ ràng thu c tính ph thu c vào order_id; ngày l p hóa đơn ph i liên quan đ n hóa đơn, n u khơng ch 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 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 th t c có th t o m t hóa đơn mà khơng có item (m t hóa đơn r ng) Nhưng khơng ph i v n đ c a Chúng ta xem xét li u m t hóa đơn đó, l p vào m t ngày có ph thu c vào m t item khơng? Rõ ràng không V n đ đ khơng t n t i hóa đơn r ng 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 xem xét thu c tính cịn l i Chúng ta c n tìm t t c thu c tính khơng th a mãn 2NF đ x lí 10 customer_id 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 lí Đây m t u thú v : customer_id (cùng v i thu c tính customer_* khác) khơng ph thu c vào customer_id l n order_id, t c không ph thu c vào b t c thu c tính c a khóa chính) Chúng ta s làm v i chúng? Chúng ta ch quan tâm t i chúng xem xét d ng chu n 3NF Bây gi đánh d u chúng “không rõ ràng” (unknown) ? item_description miêu t v hàng hóa Rõ rang ph thu c vào item_id Nhưng có th t n t i mà khơng c n order_id? Có! M t item có th t n t i kho 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 u ki n c a 2NF item_qty s lư ng m t m t hàng đư c yêu c u m t hóa đơn Rõ rang thu c tính ph thu c vào c hai thu c tính c a khóa Chúng ta ch có th nói “5 máy tính” hay “6 TV” ch khơng th nói “10 khơng c ” (ít nh t thi t k CSDL) S lư ng m t hàng hóa đư c yêu c u 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 th a mãn 2NF item_price tương t item_description Nó ch ph thu c vào item_id mà khơng ph thu c vào order_id, nên khơng th a mãn 2NF item_total_price đ c bi t M t m t, có v ph thu c vào c order_id l n item_id, t c th a mãn 2NF M t khác, m t giá tr rút t item_qty item_price Chúng ta s x lí th nào? Trong th c t , trư ng không liên quan đ n CSDL c a Nó có th d dàng đư c t o ben ngồi CSDL; thêm vào CSDL s gây dư th a Do s b order_total_price, t ng t t c item_total_price l i m t giá tr rút n a nên s b thu c tính Đây b ng phân tích 2NF c a chúng ta: Chúng ta s làm v i m t b ng không th a mãn 2NF th ? Trư c tiên, l y n a sau c a khóa (item_id) đưa 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 đ - đưa vào b ng m i Chúng ta s g i b ng m i 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 thu c tính ch ph thu c vào n a đ u c a khóa (order_id) thu c tính chưa xác đ nh – gi nguyên Hình D: Bàng orders b ng m i: order_items Có m t vài m c n ý: 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 B ng orders có thu c tính trư c Khóa c a b ng orders ch g m m t thu c tính: order_id Khóa c a b ng order_items g m hai thu c tính Sau c u trúc b ng (Hình E): Hình E: C u trúc b ng orders order_items table N u b n chưa quen đ c Lư c đ liên k t th c th xin đ ý vào đư ng n i gi a hai b ng Đư ng n i 12 có nghĩa là: • M i order có th có m t ho c nhi u order-item, ph i có nh t m t; • M i order-item có th thu c v m t ch m t order 13 Dạng chu n thứ (2NF): Pha thứ II N u b n nghĩ r ng đ t chu n 2NF ch đã, v n còn! Nh r ng d ng chu n 2NF áp d ng cho b ng có khóa h p thành b i m t thu c tính Bây gi b ng orders có khóa khóa đơn, b ng 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 t o b i hai thu c tính Chúng ta l i ph i phân tích xem đ t 2NF chưa Chúng ta l i làm theo cách cũ, v i m i thu c tính, đ t câu h i: Li u thu c tính có th t n t i mà không c n m t hay nhi u thu c tính n m khóa khơng? Bên c nh Hình F, bi u di n c u trúc c a b ng order_items Bây gi l n lư t xem xét thu c tính khơng khóa item_description ph thu c vào item_id, khơng ph thu c vào order_id Do đó, thu c tính 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 nên thu c tính 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 vi ph m u ki n c a chu n 2NF Chúng ta có b ng phân tích sau: Bây gi , l y thu c tính khơng th a mãn u ki n c a chu n 2NF đưa vào m t b ng m i Chúng ta g i b ng m i b ng items: Hình G: B ng order_items b ng items 14 Khoan đã, có khơng n Lúc trư c, sau ki m tra u ki n c a chu n 2NF, l y t t c thu c tính ph thu c vào item_id đưa vào m t b ng m i L n này, l i l y 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 có khác mà l i làm v y? Đi m khác ch : l n trư c, đưa thu c tính khóa item_id kh i b ng orders, quan h m t-nhi u gi a orders order-items Do đó, thu c tính item_qty ph i item_id vào b ng m i L n này, item_id không đư c đưa kh i b ng order_items quan h nhi u-m t gi a order-items items Do đó, item_qty khơng vi ph m chu n 2NF nên đư c gi l i b ng có khóa 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 b ng order_items nghĩa là: • M i item có th n m m t s hóa đơn ho c khơng n m hóa đơn • M i order-item có th liên quan đ n m t ch m t item Hai quan h 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, cách bi u di n quan h nhi u-nhi u: M t order có th có nhi u item; m t item có th thu c v nhi u order Nh r ng l n này, khơng đưa thu c tính khóa order_id vào b ng m i Lí m i item c th , khơng c n ph i bi t thu c v order B ng order_items lưu tr 15 nh ng thơng tin dó thơng qua hai thu c tính order_id item_id Hai thu c tính đ ng k t h p v i t o thành khóa cho b ng order_items, đ ng riêng r , chúng khóa ngo i (foreign keys) tr t i hàng b ng khác Chúng ta s nói nhi u v khóa ngo i ph n 3NF Cũng ý r ng, b ng m i khóa h p thành b i nhi u thu c tính nên th a mãn u ki n c a d ng chu n 2NF Đ n đây, CSDL c a đ t d ng chu n 2NF! 16 Dạng chu n thứ (3NF): Khơng có phụ thuộc hàm vào thuộc tính khơng khóa Cu i cùng, 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ó m t order, s ph i nh p thông tin v khách hàng nhi u l n X y hi n tư ng b ng order có t n t i thu c tính ph thu c vào m t thu c tính khơng khóa Đ hi u rõ 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 vơ nghĩa n u khơng có order Khi đó, order_date đư c g i ph thu c vào thu c tính khóa (vì order_id m t thu c tính khóa) Cịn thu c tính customer_name sao— li u có th t n t i m t bên ngồi b ng orders? Có V n có nghĩa 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 thu c tính customer_address, customer_city, customer_state B n thu c tính ch ph thu c vào customer_id – m t thu c tính khơng khóa Các trư ng s thu c v m t b ng khác, c a riêng chúng, v i customer_id làm khóa (xem Hình I) Hình I: Tuy nhiên, đ ý Hình I, c t đ t m i quan h gi a b ng Orders v i thông tin v khách hàng Do v y, ph i khôi ph c m i quan h b ng cách t o m t khóa ngo i (Foreign key - FK) b ng Orders Khóa ngo i v b n ch t m t thu c tính tr t i khóa c a m t b ng khác Hình J ERD hồn thi n c a chúng ta: 17 Hình J: ERD hồn ch nh Quan h gi a orders customers có th đư c di n gi i sau: • M t order đư c t o b i m t ch m t customer; • M t customer có th có nhi u order ho c khơng có order c Cu i cung, d li u b n b ng c a Nh khơng ph i tách hàng Hình K: r ng, 3NF tách c t, 18 Tham khảo Sau 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 d ng chu n hóa: en.wikipedia.org/wiki/Database_normalization ... Dạng chuẩn thứ (1NF): Khơng có phần tử/nhóm phần tử lặp Dạng chuẩn thứ (2NF): Khơng có phụ thuộc hàm khơng đầy đủ vào khóa Dạng chuẩn thứ (2NF): Pha thứ II 13 Dạng chuẩn. .. khóa ngo i ph n 3NF Cũng ý r ng, b ng m i khơng có khóa h p thành b i nhi u thu c tính nên th a mãn u ki n c a d ng chu n 2NF Đ n đây, CSDL c a đ t d ng chu n 2NF! 16 Dạng chu n thứ (3NF) : Khơng... trình bày qui t c q trình chu n hóa, tơi d a theo ví d c n v Hóa đơn (Invoice) chu n hóa v d ng 3NF (Third Normal Form) Trong q trình đó, s hình thành Sơ đ liên k t th c th (Entity Relationship