Object-relational mapping
posted on 25 Jul 2008 07:48 by wonam in softdevเทคโนโลยีในการพัฒนาซอฟต์แวร์หลายอย่าง เมื่อได้ใช้แล้วทำให้กลับไปทำงานแบบเดิม ๆ แล้วรู้สึก "ขาดแคลน" อย่างยิ่ง
หนึ่งในนั้นคือ Object-relational mapping หรือ ORM
หลายคนเวลาเริ่มเขียนโปรแกรมที่ติดต่อกับ relational database ก็จะเริ่มจากการออกแบบตาราง จากนั้นก็มาเขียนตัวเชื่อมต่อเข้ากับ database server แล้วก็หาวิธีการ query ผ่านทางคำสั่ง SQL แล้วก็อ่านผล
สมัยก่อนก็คงจะเป็นเครื่องมือ RAD พวก visual basic, delphi หรืออะไรพวกนี้ ถ้าสมัยนี้ก็คงจะเป็นภาษา PHP ยอดนิยม หน้าตาของโปรแกรมถ้าไม่ refactor ให้สวยงามก็จะออกมาประมาณนี้:
$myserv = mysql_connect("localhost","username","password"); if(mysql_query("use mydb")) { $sql = "select * from mj_selection where id='$id'"; $result = mysql_query($sql); if(mysql_num_rows($result)==1) $sel = str_to_sel(mysql_result($result,0,"priority")); else $sel = random_sel(); } mysql_close($myserv); return $sel;
ถ้าเขียนบ่อย ๆ แล้วแยกโมดูลดี ๆ ก็คงไม่ลำบากมาก อย่างไรก็ตาม ลองเทียบกับโปรแกรมที่เข้าถึง database ผ่านทาง ORM ดูนะครับ อันนี้เป็นโปรแกรมที่เขียนบน Ruby on Rails แล้วก็ใช้ตัว ORM ที่มากับมัน เป็นการเพิ่มข้อมูลลงในตาราง Users ที่มีการเชื่อมโยงกับตาราง Sites โดยที่แต่ละแถวของตาราง sites ก็จะโยงไปที่ตาราง countries ด้วย
user = User.new({:name => name}) user.site = site user.country = site.country user.save
สำหรับ PHP ก็มีไลบรารี ORM หลายตัว ผมลองกด ๆ ดูก็มี หลายตัวเช่น Propel ซึ่งโปรแกรมตัวอย่างที่เขียนในเว็บก็หน้าตาประมาณนี้:
$book = new Book(); $book->setTitle("War & Peace"); $book->setIsbn("0140444173"); $book->setPublisher($pub); $book->setAuthor($author); $book->save(); // saves all 3 objects!
ORM น่าจะเริ่มโด่งดังมาจากทางนักพัฒนา Java โดยไลบรารีมาตรฐานคือ Hibernate ในขณะที่ผมเริ่มรู้จัก ORM ผ่านทาง ActiveRecord ของ Ruby on Rails
แนวคิดทั่วไปของ ORM ก็คือการ map ข้อมูลในฐานข้อมูลเชิงสัมพันธ์ไปเป็นวัตถุ แบบที่ง่ายที่สุดก็จะเป็นการ map ตาม Active Record Pattern ที่ Martin Folwer เขียนไว้ คือ:
วัตถุจะครอบแถวในตารางหรือมุมมอง (view) จากฐานข้อมูล และจัดการการติดต่อกับฐานข้อมูลรวมถึงจัดการกิจกรรมเฉพาะงานของข้อมูลนั้น
ถ้าเป็นการ map แบบที่พิศดารหน่อย ก็อาจจะ map ได้ซับซ้อนกว่า library ที่สามารถทำได้ เช่น (เท่าที่ผมทราบ) Hibernate
ตอนนี้ web framework ใหม่ ๆ ที่เกิดขึ้นมา เท่าที่ผมดูก็ไม่มีตัวไหนแล้วที่ไม่ได้มาพร้อมกับ ORM
ที่เขียนมาและยกตัวอย่างนี่ก็ไม่ใช่อะไรหรอกครับ ผมว่าหลาย ๆ คนในนี้ก็ใช้พวกนี้อยู่แล้ว แต่คิดว่าหลาย ๆ คนก็ไม่เคยใช้ ก็เลยลองเอามาแนะนำดูครับ ถ้ามีเวลาลองหัดเผื่อจะทำให้ชีวิตสนุกสนานขึ้นนะครับ
หมายเหตุ: ขอบคุณ syntax highlighter จากเว็บ tohtml ครับ
ลิงก์เพิ่มเติม (26 กค 51):

ไม่ได้ยุ่งกะ DB มาชาติกว่าแล้ว
#1 By plynoi แว่วศรี on 2008-07-25 10:04