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): 

Comment

smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry ???????????????   ??????????????????
smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry ???????????????

Tweet

confused smile confused smile ขอบคุณครับ
ไม่ได้ยุ่งกะ DB มาชาติกว่าแล้ว

#1 By plynoi แว่วศรี on 2008-07-25 10:04

ขอบคุณคร้าบ หลังสอบต้องลองซะหน่อยแล้วว

#2 By ch_a_m_p on 2008-07-25 10:56

เห็นคนพูดถึกันเยอะ แต่ไม่มีโอกาศได้ลองใช้ซักที มั่วแต่ปั่น php อยู่ sad smile
ยังไม่ค่อยเห็น ORM ใน php ที่ดูดีนอกจากของ Cake ซึ่งช้ามากมาย sad smile

#3 By CyberAlchemist on 2008-07-25 15:14

ขอแนะนำเพิ่มครับ ตอนนี้ที่น่าสนใจมาใหม่มี 2 ตัวครับ

ทางฝั่ง Java คือ EclipseLink ที่ Oracle บริจาค opensource มาทั้งหมด http://www.eclipse.org/eclipselink/

ทางฝั่ง .NET ออก ADO.NET Entity Framework http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspxbig smile

#4 By deans4j (124.120.136.7) on 2008-07-26 03:29

คุณ plynoi: ;) แล้วตอนนี้ทำไรอ่ะครับ

ch_a_m_p: มาทำเล่นกัน

plug.in: อืม... มันคงช้ากว่าเขียนธรรมดาพอตัวแฮะ

คุณ deans4j: น่าลองทั้งนั้นเลย ไว้ไปกดดูครับ ขอบคุณที่แนะนำครับ

#5 By wonam on 2008-07-26 08:34

http://en.wikipedia.org/wiki/RAD <-- RAD อันไหนครับ?

#6 By อานนท์ (203.130.143.243) on 2008-07-27 00:23

อานนท์: Rapid application development - http://en.wikipedia.org/wiki/Rapid_application_development

#7 By wonam on 2008-07-27 01:32