Năm vấn đề chung về cơ sỡ dữ liệu trên PHP

Chia sẻ: TRẨN THỊ THANH HẰNG | Ngày: | Loại File: PDF | Số trang:10

0
140
lượt xem
68
download

Năm vấn đề chung về cơ sỡ dữ liệu trên PHP

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

hãy khám phá năm vấn đề về cơ sỡ dữ liệu phố biến trong các ứng dụng PHP-gồm thiết kế lược đồ cơ sở dữ liệu,truye cập cơ sở dữ liệu và mã logic nghiệp vụ sử dụng cơ sở dữ liệu-cũng như giải pháp của chúng

Chủ đề:
Lưu

Nội dung Text: Năm vấn đề chung về cơ sỡ dữ liệu trên PHP

  1. N mv n chung v c s d li u trên PHP Page 1 of 10 N mv n chung v c s d li u trên PHP M c : Trung bình Jack Herrington, T ng biên t p, Code Generation Network 08 01 2010 Hãy khám phá n m v n v c s d li u ph bi n x y ra trong các ng d ng PHP -- g m thi t k l c c s d li u, truy c p c s d li u và mã logic nghi p v s d ng c s d li u -- c ng nh các gi i pháp c a chúng. N u ch có m t cách s d ng c s d li u chính xác ... B n có th t o thi t k c s d li u, truy c p c s d li u và mã logic nghi p v PHP t trên u trang c a nó theo m t s cách nào ó và b n th ng k t thúc khi nh n th y nó sai. Bài vi t này minh h a n m v n th ng g p trong vi c thi t k c s d li u, trong mã PHP truy c p các c s d li u và cách s a ch a nh ng v n này khi b n b t g p chúng. V n 1: S d ng MySQL tr c ti p Khi s dùng các hàm mysql_ truy c p tr c ti p vào c s d li u có m t v n ph bi n là mã PHP ã c . Li t kê 1 ch ra cách truy c p tr c ti p vào c s d li u. Li t kê 1. Access/get.php ! ! "#$%$&' ()*+ ,-$)$ ". ." " ! /01! 2 ! 2 3 4 5 ! 6 Hãy l u ý vi c s d ng hàm mysql_connect truy c p vào c s d li u. C ng chú ý truy v n trong ó có dùng s liên k t chu i b sung tham s $name vào truy v n ó. K! thu t này có hai s l a ch n t t: mô un PEAR DB và các l"p PHP Data Objects (PDO-Các i t ng d li u PHP). C hai u cung c p s tr#u t ng t# vi c l a ch n c a m t c s d li u c th . Do ó, mã c a b n có th ch y mà không c n i u ch nh quá nhi u trên IBM® DB2®, MySQL, PostgreSQL, ho c c s d li u khác b t k$ mà b n mu n k t n i n. Các giá tr% khác trong vi c s d ng các t ng tr#u t ng c a mô un PEAR DB và PDO là b n có th s d ng toán t ? trong các câu l nh SQL c a b n. Vi c này làm cho SQL d& dàng b o trì h n và b o v ng d ng c a b n kh'i các cu c t n công n i x SQL. Mã thay th khi s d ng PEAR DB c hi n th% d "i ây. Li t kê 2. Access/get_good.php "78. " !
  2. N mv n chung v c s d li u trên PHP Page 2 of 10 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 #$%$&' ()*+ ,-$)$ ! ! ?6 @ /01! 2 ! 2 3 4 5 ! 6 Chú ý r(ng t t c các c p tr c ti p c a MySQL ã di&n ra, tr# chu i k t n i c s d li u trong $dsn. Ngoài ra, chúng ta s d ng bi n $name trong SQL thông qua toán t ?. Sau ó, d li u v"i truy v n này c g i i thông qua array cu i ph ng th c query(). V n 2: Không s d ng ch c n ng t ng t ng Gi ng nh h u h t các c s d li u hi n i, MySQL có kh n ng t o các trình nh n d ng (identifier) duy nh t t ng t ng trên m t c s cho m i b n ghi. M c dù v y, chúng ta v)n th y mã l n u tiên ch y m t l nh SELECT tìm mã nh n d ng (id) t i a, sau ó b sung thêm m t vào id ó, c ng nh m t b n ghi m"i. Li t kê 3 cho th y m t l c m)u bad (x u). Li t kê 3. Badid.sql 7)*= '>8%$ @( $A@#'# ! &)$>'$ '>8%$ +$7@B+@C' '$A' '$A' ! @C#$)' @C'* D>%B$# E 4 5 ! @C#$)' @C'* D>%B$# F 4 ! @C#$)' @C'* D>%B$# E 4 ! Tr ng id ây c quy %nh n gi n là m t s nguyên. Vì v y, m c dù nó s* là duy nh t, chúng ta có th thêm vào b t k$ giá tr% nào mà chúng ta mu n, nh ã ch ra trong câu l nh INSERT ti p theo câu l nh CREATE. Li t kê 4 ch ra mã PHP b sung thêm users (nh ng ng i s d ng) vào ki u l c này. Li t kê 4. Add_user.php "78. " ! ! 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 "#$%$&' G ()*+ " ! ! ?6 @ /01! 2 H E! ?6 "@C#$)' @C'* D>%B$# " ! ?6 G ! ! 2
  3. N mv n chung v c s d li u trên PHP Page 3 of 10 4 ! 3 ! 6 Mã trong add_user.php u tiên th c hi n m t truy v n tìm ra giá tr% t i a c a id. Sau ó t p này ch y m t câu l nh INSERT v"i giá tr% id c ng thêm m t. Mã này có th không ch y thành công trong các i u ki n ganh ua (race) trên các máy ch có m t t i n ng. H n n a, nó không hi u qu . Vì v y, s thay th là gì? S d ng tính n ng t ng t ng trong MySQL t o các ID duy nh t cho m i l n chèn t ng. L c c p nh t c hi n th% bên d "i. Li t kê 5. Goodid.php 7)*= '>8%$ @( $A@#'# ! &)$>'$ '>8%$ +$7@B+@C' C*' CB%% >B'* @C&)$+$C' '$A' C*' CB%% '$A' C*' CB%% =)@+>)I J$I ! @C#$)' @C'* D>%B$# 4 5 ! @C#$)' @C'* D>%B$# 4 ! @C#$)' @C'* D>%B$# 4 ! Chúng ta thêm c NOT NULL ch ra r(ng các tr ng này không r ng (null). Chúng ta c ng ã b sung c AUTO_INCREMENT ch th% r(ng tr ng này t ng t ng, c ng nh c PRIMARY KEY ch th% tr ng nào là id. Nh ng thay i này cho phép t ng m t chút t c . Li t kê 6 cho th y mã PHP ã c p nh t, mã này chèn users (nh ng ng i dùng) vào b ng. Li t kê 6. Add_user_good.php "78. " ! 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 "@C#$)' @C'* D>%B$# " ! ?6 G ! ?6 "#$%$&' " ! ! ?6 @ /01! 2 ! 2 4 ! 3 ! 6 Thay vì nh n c giá tr% id t i a, tôi bây gi ch c n s d ng câu l nh INSERT chèn d li u, sau ó s d ng m t câu l nh SELECT l y id c a b n ghi v#a m"i c chèn vào. Mã này n gi n h n nhi u và hi u qu h n so v"i phiên b n g c và l c liên quan c a nó. M t l a ch n khác i v"i ch c n ng t ng t ng c a MySQL là s d ng ph ng th c nextId() trong h th ng PEAR DB. Trong tr ng h p c a MySQL, i u này t o ra m t b ng tu n t m"i và qu n lý vi c s d ng m t c ch khóa ph c t p. L i th c a vi c s d ng ph ng th c này là nó s* ho t ng trên các h th ng c s d li u khác. Dù b(ng cách nào, b n nên s d ng m t h th ng qu n lý s t ng các ID duy nh t cho b n và không d a vào h th ng mà b n truy v n u tiên, sau ó t ng giá tr% c a chính b n và thêm b n ghi. Cách ti p c n th hai d& b% nh h ng theo các i u ki n ganh ua trên các trang có kh i l ng cao.
  4. N mv n chung v c s d li u trên PHP Page 4 of 10 V n 3: S d ng nhi u c s d li u M t khi chúng ta th y ng d ng mà m i b ng trong m t c s d li u riêng bi t. Có nhi u lý do th c hi n i u ó trong các c s d li u r t l"n, nh ng i v"i ng d ng trung bình, b n không c n m c phân o n này. Ngoài ra, m c dù có th th c hi n các truy v n liên quan trên nhi u c s d li u, tôi r t khuyên b n ch ng l i nó. Cú pháp ph c t p h n. Qu n lý sao l u và khôi ph c l i không d& dàng. Cú pháp có th ho c không th làm vi c gi a các máy c s d li u khác nhau. Và th t khó kh n ti p t c theo c u trúc quan h khi các b ng c chia trên nhi u c s d li u. Vì v y, nhi u c s d li u s* gi ng th nào? + b t u, b n c n m t s d li u. Li t kê 7 cho th y d li u này c chia thành b n t p. Li t kê 7. Các t p c s d li u ( . 9 &)$>'$ '>8%$ +$7@B+@C' +$7@B+@C' '$A' '$A' ! % . 9 @C#$)' @C'* D>%B$# E E E.4 : E.4 ! @C#$)' @C'* D>%B$# F E F.4 : F.4 ! B . 9 7)*= '>8%$ @( $A@#'# ! &)$>'$ '>8%$ +$7@B+@C' '$A' '$A' ! % . 9 @C#$)' @C'* D>%B$# E 4 5 ! @C#$)' @C'* D>%B$# F 4 ! Trong phiên b n nhi u c s d li u c a các t p này, b n s* n p câu l nh SQL vào trong m t c s d li u, sau ó n p các câu l nh SQL users (nh ng ng i s d ng) vào c s d li u khác. Mã PHP truy v n c s d li u cho các t p này liên k t v"i ng i dùng c th c hi n th% d "i ây. Li t kê 8. Getfiles.php "78. " ! 9:: 9 ; : E ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 "#$%$&' ()*+ ,-$)$ " ! ! ?6 @ /01! 2 ! 2 ! ! 9:: 9 ; : F ! < 7899& ! =$>)99 $ ?6 + ! 2
  5. N mv n chung v c s d li u trên PHP Page 5 of 10 ?6 "#$%$&' K ()*+ ,-$)$ " ! ?6 @ /1 ! 2 ! 2 4 5 ! 3 ! 6 Hàm get_user k t n i t"i c s d li u ch a b ng c a nh ng ng i s d ng và l y ra ID cho m t ng i dùng ã bi t. Hàm get_files k t n i n b ng các t p và l y ra các hàng có k t h p v"i ng i dùng ã bi t. Cách t t h n làm t t c nh ng i u này là n p d li u vào m t c s d li u, sau ó th c hi n m t truy v n, nh c hi n th% bên d "i. Li t kê 9. Getfiles_good.php "78. " ! ! 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 "#$%$&' .K ()*+ ,-$)$ . >C7 . . " ! ?6 @ /1 ! 2 ! 2 4 5 ! 3 ! 6 Mã này không ch ng n h n mà nó c ng d& hi u h n và hi u qu h n. Thay vì th c hi n hai truy v n, chúng ta ang th c hi n m t. Trong khi v n này l c i u, chúng ta ã th y nó trong th c t có th i gian bi t r(ng t t c các b ng ph i trong cùng m t c s d li u, tr# khi có m t lý do c p thi t khác. V n 4: Không s d ng các m i quan h Các c s d li u quan h không gi ng nh các ngôn ng l p trình. Chúng không có ki u m ng. Thay vào ó, chúng s d ng các m i quan h gi a các b ng t o ra c u trúc m t-t"i-nhi u gi a các i t ng, chúng có cùng tác d ng nh m t m ng. M t v n mà tôi ã th y v"i các ng d ng là khi các k! s c g ng s d ng m t c s d li u nh th nó ã là m t ngôn ng l p trình, t o arrays (các m ng) b(ng cách s d ng chu i v n b n v"i các trình nh n d ng tách nhau b(ng d u ph,y. Hãy xem l c d "i ây. Li t kê 10. Bad.sql 7)*= '>8%$ @( $A@#'# ! &)$>'$ '>8%$ +$7@B+@C' '$A' '$A' !
  6. N mv n chung v c s d li u trên PHP Page 6 of 10 7)*= '>8%$ @( $A@#'# ! &)$>'$ '>8%$ +$7@B+@C' '$A' '$A' '$A' ! @C#$)' @C'* D>%B$# E E.4 : E.4 ! @C#$)' @C'* D>%B$# F E.4 : E.4 ! @C#$)' @C'* D>%B$# E 4 5 E F ! M t ng i dùng trong h th ng có th có nhi u t p. Trong m t ngôn ng l p trình, b n s* s d ng m t m ng bi u di&n các t p liên k t v"i ng i dùng. Trong ví d này, l p trình viên ã ch n t o ra m t tr ng files (các t p) ch a danh sách các id t p c phân cách b(ng d u ph,y. + có c m t danh sách t t c các t p cho ng i dùng c th , l p trình viên tr "c tiên ph i c hàng t# b ng nh ng ng i dùng, sau ó phân tích cú pháp v n b n c a t p và ch y m t câu l nh SELECT riêng l- cho m i t p. Mã này c hi n th% bên d "i.. Li t kê 11. Get.php "78. " ! 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 "#$%$&' ()*+ ,-$)$ " ! ! ?6 @ /01! 2 ! ?6 "#$%$&' K ()*+ ,-$)$ " ! ?6 @ /1 ! 2 2 ! 2 4 5 ! 3 ! 6 K! thu t này ch m, khó b o trì và không t n d ng t t c s d li u. Gi i pháp duy nh t là tái ki n trúc l c này a nó tr l i thành m t d ng quan h truy n th ng, nh c hi n th% d "i ây. Li t kê 12. Good.sql 7)*= '>8%$ @( $A@#'# ! &)$>'$ '>8%$ +$7@B+@C' +$7@B+@C' '$A' '$A' ! 7)*= '>8%$ @( $A@#'# ! &)$>'$ '>8%$ +$7@B+@C' '$A' '$A' ! @C#$)' @C'* D>%B$# E 4 5 ! @C#$)' @C'* D>%B$# E E E.4 : E.4 ! @C#$)' @C'* D>%B$# F E E.4 : E.4 !
  7. N mv n chung v c s d li u trên PHP Page 7 of 10 . ây, m i t p có liên quan n ng i dùng thông qua hàm user_id trong b ng t p. +i u này h u nh có v- l c h u v"i b t k$ ai nhìn th y i u này nh là m t m ng. Ch c ch n, các m ng không tham chi u n i t ng trong m ng -- th c t , ng c l i hoàn toàn. Nh ng trong m t c s d li u quan h , ây là cách nh ng th này làm và lí do các truy v n là nhanh h n và d& dàng h n nhi u. Li t kê 13 cho th y mã PHP t ng ng. Li t kê 13. Get_good.php "78. " ! 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ! ?6 "#$%$&' .K ()*+ ,-$)$ . >C7 . . " ! ?6 @ /1 ! 2 ! 2 4 5 ! 3 ! 6 . ây, chúng ta th c hi n m t truy v n n c s d li u nh n c t t c các hàng. Mã này không ph c t p và nó s d ng c s d li u nh nó ã cd %nh. V n 5: M u n+1 Tôi không th nói cho b n bi t bao nhiêu l n chúng ta ã nhìn th y các ng d ng l"n trong ó mã này u tiên l y ra m t danh sách các th c th -- g i là các khách hàng -- sau ó quay tr l i và l y ra chúng t#ng ng i m t có c nh ng chi ti t cho t#ng th c th . Chúng ta g i nó là m)u n+1 vì ó là có bao nhiêu truy v n s* c th c hi n -- m t truy v n l y ra danh sách t t c các th c th , r i m t truy v n cho m i m t trong n th c th . +ây không ph i là m t v n khi n = 10, nh ng s* là gì khi n = 100 ho c n = 1000? R i, s thi u kh n ng th c s óng góp vào. Li t kê 14 cho th y m t ví d v m t l c nh v y. Li t kê 14. Schema.sql 7)*= '>8%$ @( $A@#'# ! &)$>'$ '>8%$ +$7@B+@C' C*' CB%% >B'* @C&)$+$C' '$A' C*' CB%% =)@+>)I J$I ! 7)*= '>8%$ @( $A@#'# 5 ! &)$>'$ '>8%$ 5 +$7@B+@C' C*' CB%% >B'* @C&)$+$C' +$7@B+@C' C*' CB%% '$A' C*' CB%% =)@+>)I J$I ! @C#$)' @C'* D>%B$# L 5 - ! @C#$)' @C'* D>%B$# 7 3 ' ! @C#$)' @C'* 5 D>%B$# E & M > ! @C#$)' @C'* 5 D>%B$# E = - 5 ! @C#$)' @C'* 5 D>%B$# E =-= - 5 ! @C#$)' @C'* 5 D>%B$# F = = ! @C#$)' @C'* 5 D>%B$# F ) ) ! @C#$)' @C'* 5 D>%B$# F = ) !
  8. N mv n chung v c s d li u trên PHP Page 8 of 10 +ây là l c áng tin c y. Không có gì sai ây. V n là trong mã truy c p vào c s d li u tìm t t c các sách cho m t tác gi c th , nh c hi n th% d "i ây. Li t kê 15. Get.php 78. ! 9:: 9 ; : 5 ! < 7899& ! =$>)99 $ ?6 + ! 2 ! ?6 "#$%$&' ()*+ ,-$)$ " ! ! ?6 @ /01! 2 ! 2 5 ! ?6 "#$%$&' ()*+ 5 ,-$)$ " ! ! ?6 @ /1 /01! 2 ! 2 5 ! ?6 "#$%$&' K ()*+ 5 ,-$)$ " ! ?6 @ ! 2 ! 2 L 5 - ! 5 5 ! 5 5 5 5 5 ! 3 5 ! 2 6 N u b n nhìn vào mã d "i cùng, b n có kh n ng suy ngh/ n chính mình, "Ôi, i u này th c s s ch s*." Tr "c tiên, nh n c id, tác gi , r i nh n c m t danh sách các cu n sách, sau ó nh n c thông tin v m i cu n sách. Ch c ch n, nó s ch s* -- nh ng nó có hi u qu không? Không. Hãy nhìn xem chúng ta ph i th c hi n bao nhiêu các truy v n l y ra ch các sách c a Jack Herrington. M t truy v n nh n c m t id, m t truy v n khác nh n c m t danh sách các cu n sách, sau ó m t truy v n cho m i cu n sách. N m truy v n cho ba cu n sách! Gi i pháp này là có m t hàm th c hi n m t s l ng l"n truy v n, nh li t kê d "i ây. Li t kê 16. Get_good.php 78. ! 9:: 9 ; : 5 ! < 7899& ! =$>)99 $ ?6 + ! 2 5 ! ?6 "#$%$&' 5 .K ()*+ 5 ,-$)$ 5 . . >C7 . " !
  9. N mv n chung v c s d li u trên PHP Page 9 of 10 ! ?6 @ /1 ! 2 ! 2 5 5 L 5 - ! 3 5 ! 6 Bây gi l y ra danh sách yêu c u ch m t truy v n, nhanh. Nó có ngh/a là tôi có kh n ng s* ph i có m t s các ki u các ph ng th c này v"i các tham s khác nhau, nh ng th c s không có s l a ch n nào. N u b n mu n có m t ng d ng PHP có th so sánh c v"i nhau, b n ph i s d ng hi u qu c s d li u và i u ó có ngh/a là các truy v n thông minh h n. V n v"i ví d này là nó quá rõ ràng. Thông th ng, các ki u c a v n n+1 hay n*n nh y c m h n nhi u. Và chúng ch xu t hi n khi ng i qu n tr% c s d li u ch y m t trình %nh hình truy v n trên h th ng c a b n khi nó có v n v hi u n ng. K t lu n Các c s d li u là các công c m nh và -- nh t t c các công c m nh m* -- chúng có th b% l m d ng n u b n không bi t cách s d ng chúng cho úng. Th thu t phía sau vi c xác %nh và gi i quy t các v n này là hi u rõ h n v công ngh bên d "i. Quá lâu, tôi ã nghe các nhà mã hóa logic nghi p v than th r(ng h không mu n ph i hi u c s d li u ho c mã SQL. H bao b c c s d li u trong các i t ng và t h'i t i sao hi u n ng l i kém n nh v y. H không nh n ra r(ng s hi u bi t SQL là nguyên t c c b n chuy n c s d li u t# m t hoàn c nh khó kh n thành m t ng minh m nh. N u b n s d ng c s d li u hàng ngày, nh ng SQL không phù h p v"i b n, hãy c The Art of SQL (Ngh thu t SQL). +ây là h "ng d)n thi t th c, c vi t rõ ràng nh n c nhi u nh t bên ngoài m t c s d li u. Tài nguyên H ct p The Art of SQL (Ngh thu t SQL), c a Stephane Faroult và Peter Robson, là m t cu n sách ph i c i v"i các l p trình viên, nh ng ng i s d ng c s d li u trong các ng d ng c a h . PHP.net là i m kh i u cho t t c m i th PHP. Tài li u PEAR DB là m t tài nguyên xu t s c. Tài li u các ch c n ng PDO có th a b n lên nt c trên PHP Data Objects (PDO- Các it ng d li u PHP). MySQL.org có tài li u h "ng d)n xu t s c v"i các ví d hi n th% cách s d ng m t c s d li u t t h n. Truy c p tài nguyên d án PHP c a developerWorks IBM tìm hi u thêm v PHP. Theo sát v"i các s ki n k! thu t và webcast c a developerWorks. Hãy xem các h i ngh%, các cu c tri n lãm th ng m i, webcast s p t"i và các s ki n trên th gi"i mà các nhà phát tri n mã ngu n m c a IBM ang quan tâm. Truy c p vào l/nh v c mã ngu n m c a developerWorks v"i các thông tin h "ng d)n r ng l"n, các công c và d án giúp b n phát tri n v"i các công ngh mã ngu n m và s d ng chúng v"i các s n ph,m c a IBM.
  10. N mv n chung v c s d li u trên PHP Page 10 of 10 + nghe các cu c ph'ng v n và th o lu n thú v% v"i các nhà phát tri n ph n m m, hãy xem developerWorks podcasts. L y s n ph m và công ngh + i m"i d án phát tri n ngu n m ti p theo c a c a b n v"i ph n m m dùng th IBM, có s0n t i xu ng ho c trên /a DVD. Th o lu n Dành tâm trí cho c ng ng developerWorks b(ng cách tham gia vào các blog c a developerWorks. ôi nét v tác gi Jack D. Herrington là k! s ph n m m cao c p v"i h n 20 n m kinh nghi m. Ông là tác gi c a ba cu n sách: Code Generation in Action, Podcasting Hacks và PHP Hacks. Ông c ng ã vi t h n 30 bài báo.
Đồng bộ tài khoản