Thaimisc.com : PHP กับฐานข้อมูล MySQL (24)
ThaiMisc.Com : Free Webboard | Free GuestBook | Free Poll | Free Ecard Server | Free Java Chat Room | Advertising | Contact Us | Colocation | Web Hosting | เปิดร้านค้าฟรี


Category : Php Developer Print Article Only Print Aticle With Comment
PHP กับฐานข้อมูล MySQL (24)
เขียนโดย เดอะกาฝากไดอารี่ (ball@bbznet.com) , 19-07-2004

ผมได้พูดถึงการทำ normalization ไปแล้ว ว่ามีหลักการอย่างไร โดยเขียนถึงเพียงพอสังเขปนะครับ หากต้องการศึกษาให้ลึกซึ้งถึงแก่นจริงๆ ก็คงต้องรบกวนไปหาหนังสือเกี่ยวกับการจัดการฐานข้อมูล การออกแบบฐานข้อมูล มาอ่านเพิ่มเติมครับ... ส่วนตัวผมเองนั้น ทำ normalization ด้วยสัญชาตญาณเอาน่ะ อิอิ

คราวที่แล้วหยุดเอาไว้ตรงที่การทำ normalization โดยแยกข้อมูลบางอย่าง ที่มีโอกาสซ้ำกันในระเบียนต่างๆ ได้ ออกมาเป็นตารางฐานข้อมูลต่างหาก ทั้งนี้ก็เพื่อเพิ่มควายืดหยุ่น และลดโอกาสที่จะเกิดการกรอกข้อมูลผิดพลาด ทีนี้ประเด็นของเราก็จะอยู่ที่ว่า เวลาที่จะสืบค้นข้อมูลมาแสดงผลนั้น จะทำอย่างไร?!?

ถ้าเราสืบค้นแบบนี้

SELECT * FROM employee

ผลที่ได้เราก็จะได้แบบนี้ครับ

อ่านแล้วยังพอเข้าใจนิดๆ ว่า มีพนักงานชื่ออะไรบ้าง และพนักงานคนนั้นได้เงินเดือนเท่าไหร่ แต่ว่าอยู่ตำแหน่งอะไร ประจำแผนกอะไร ไม่อาจทราบได้เลย... แผนกรหัส 1 คือแผนกอะไรฟะ?!?

สืบค้นพร้อมกันหลายตาราง
ทางแก้ก็คือ การสืบค้นข้อมูลพร้อมๆ กันทีเดียวหลายตารางครับ โดยในที่นี้ก็คือ 3 ตาราง ถือว่าเป็นการสืบค้นขั้น advance ไปอีกขั้นนึง ซึ่งหลายท่านอาจจะมองว่ามันยาก แต่จริงๆ แล้วมันไม่ได้ยากอย่างที่คิดหรอกนะครับ

สำหรับการสืบค้นนั้น สามารถกระทำได้ง่ายๆ หลายวิธีครับ แต่หลักๆ นั้น ผมขอพูดถึง 2 วิธีก็คือ

INNER JOIN
ใครที่เรียนภาษา SQL มาโดยตรง อาจารย์ผู้สอนคงจะสอนอันนี้แหละครับ การทำ INNER JOIN ถ้าจะให้เปรียบเทียบ คงต้องนึกถึงการใช้งานโปรแกรม Microsoft Access ครับ ที่เวลาจะสร้าง query ขึ้นมา มันจะให้มีการกำหนดความสัมพันธ์ของตารางแต่ละตัวได้


ตัวอย่างการกำหนดความสัมพันธ์ (ขออภัยที่ไม่ได้คัดลอกรูปมาจาก Microsoft Access โดยตรง แต่หน้าตาก็คล้ายๆ แบบนี้แหละครับ)

อ้อ! ก่อนอื่น ผมไม่แน่ใจว่าผมเคยสอนวิธีการประมวลผลคำสั่ง SQL ที่เขียนขึ้นเองผ่านทาง phpMyAdmin ไปแล้วหรือยังหนอ?!? ถ้ายัง ก็จะขอสอน ณ บัดเดี๋ยวนี้เลยครับ... ไม่ยากๆ ก็แค่ดูที่หน้าจอโปรแกรมให้ดีๆ เราจะเห็นว่ามีแถบที่เขียนว่า SQL อยู่ (ดูรูปประกอบ)

คลิกที่นี่ ก็จะเป็นหน้าจอให้เราพิมพ์คำสั่ง SQL เพื่อใช้ในการประมวลผลแล้วครับ

(1) แค่เลือกเอาว่าจะพิมพ์เอง หรือเอาคำสั่ง SQL มาจากไฟล์ (2) แล้วก็คลิกปุ่ม "ลงมือ" ก็เป็นอันเสร็จสิ้น...

พูดถึงตรงนี้แล้ว นึกถึงเวลาที่เราไปดาวน์โหลดเว็บแอปพลิเคชั่นที่ใช้ฐานข้อมูล MySQL มาอะครับ เขามักจะมีไฟล์ที่เป็นตัวโครงฐานข้อมูลของแอปพลิเคชั่น (อาจรวมไปถึงข้อมูลเบื้องต้น หรือข้อมูลตัวอย่างด้วย) มาให้ในรูปแบบไฟล์ .sql นั่นแหละครับ คือไฟล์ที่เอาไว้ใช้ในกรณีนี้

เราเรียกการรันคำสั่ง SQL ผ่านทางไฟล์ .sql เข้าไปในตัวฐานข้อมูล (ซึ่งทำได้ 2 ทางคือ ทั้ง command prompt ที่จำเป็นต้องรู้จักคำสั่ง MySQL และ ทาง phpMyAdmin นี้... หรือโปรแกรมอื่นๆ ในแบบเดียวกัน) ว่าการ dump ฐานข้อมูลครับ (ส่วนใหญ่เขาเรียกแบบนี้นะ แต่ศัพท์วิชาการจริงๆ นั้น ผมว่าเขาน่าจะเรียกว่า import ฐานข้อมูลมากกว่า)

เอาละ กลับเข้ามาที่ INNER JOIN กันต่อครับ... การใช้คำสั่ง INNER JOIN มันก็ประมาณการสร้างความสัมพันธ์ หรือกำหนดความสัมพันธ์ให้กับตารางต่างๆ นั่นเองครับ พูดไปอาจจะงง ขอให้ลองพิมพ์คำสั่งนี้ไปแล้วลองประมวลผลดู

SELECT * FROM employee INNER JOIN department_mstr ON (employee.dept_id = department_mstr.dept_id) INNER JOIN position_mstr ON (employee.pos_id = position_mstr.pos_id)

ความหมายง่ายๆ ก็คือ สืบค้นข้อมูลจากตารางชื่อ employee โดยกำหนดความสัมพันธ์กับตาราง department_mstr โดยให้ฟิลด์ dept_id ของตาราง employee กับ department_mstr นั้นหมายถึงฟิลด์เดียวกัน และกำหนดความสัมพันธ์กับตาราง position_mstr โดยให้ฟิลด์ pos_id ของตาราง employee และ position_mstr หมายถึงฟิลด์เดียวกัน

ถ้าคำอธิบายอ่านแล้วยังงงๆ อยู่ ลองไปดูผลลัพธ์ของการสืบค้นดู อาจจะเข้าใจขึ้นมาได้ครับ

สังเกตว่างานนี้ เราก็พอจะเดาได้แล้วว่า ไอ้ dept_id เป็น 1 มันหมายถึงแผนกไหน หรือ pos_id เป็น 1 หมายถึงตำแหน่งอะไร เพราะว่าข้อมูลจากตาราง department_mstr กับ position_mstr นั้นก็ถูกดึงมาให้ด้วย แถมจับคู่ตรงกันเป็นที่เรียบร้อย... นี่แหละครับ คือสิ่งที่ INNER JOIN ทำ

สำหรับ INNER JOIN นั้น จะ สลับที่ชื่อตารางยังไงก็ยังถือว่าใช้ได้ครับ ตราบเท่าที่เรากำหนดความสัมพันธ์ให้ถูกตาราง เช่น เราอาจจะเขียนคำสั่ง SQL เป็น

SELECT * FROM position_mstr INNER JOIN employee ON (position_mstr.pos_id = employee.pos_id) INNER JOIN department_mstr ON (employee.dept_id = department_mstr.dept_id)

ผลที่ได้ออกมาก็ไม่ได้แตกต่างกันมากมายนัก เพียงแต่ว่างานนี้ตารางที่เป็นแกนหลักจะไม่ใช่ตาราง employee แต่จะเป็น position_mstr แทนครับ (ดูรูปประกอบ)

แต่เวลาเอาไปใช้งานด้วย PHP น่ะ มันไม่แตกต่างกันหรอกครับ เพราะถึงตอนนั้น เราจะอ้างอิงถึงข้อมูลด้วยชื่อของฟิลด์ (แต่ถ้าใครอ้างอิงถึงข้อมูลด้วย index หรือเลขลำดับที่ของฟิลด์ อันนี้สิมีผล... เพราะถ้าเป็นคำสั่งแบบแรก index = 0 จะหมายถึง ฟิลด์ eid ของตาราง employee แต่ถ้าเป็นคำสั่งแบบที่สอง index = 0 จะหมายถึงฟิลด์ pos_id ของตาราง position_mstr ครับ)

เราจะมาพูดถึงวิธีการอื่นๆ ต่อ คราวหน้าครับ

(ติดตามตอนต่อไป) 

<- Back | Next ->

ThaiMisc.Com : Free Webboard | Free GuestBook | Free Poll | Free Ecard Server | Free Java Chat Room | Advertising | Contact Us
Copyright 1999-2006 Thailand Miscellaneous. Allrights reserved. webmaster@thaimisc.com