Wednesday, September 3, 2008

ศึกษา Object oriented Database จาก Db4o ตอน 1


Db4o เป็น Object oriented database ที่น่าสนใจและเหมาะจะนำมาใช้เพื่อการศึกษาการทำงานและหลักการ ของ OODBMS โดย Db4oสนับสนุนการทำงานแบบ Java และ .Net framework สำหรับบทความนี้เราจะใช้ Db4o เวอร์ชั่น java








คือทางเจ้าหน้าที่ได้แจ้งว่า db4o สามารถดาวน์โหลดได้จาก http://www.db4o.com/ db4o เป็นชื่อในวงการ ชื่อเต็มของมันคือ db4object เป็น software ที่เปิดเผยอยู่ในกลุม opensource เป็นผลผลิตจากสมองของชายชื่อ Carl Rosenberger, แกเริ่มพัฒนามาตั้งแต่ราวปี 2000 หลังจากรู้ที่มาแล้ว มาดูว่า db4o นั้นมีแนวคิดและหลักการทำงานอย่างไร

แนวคิดเบื้องต้นของการเก็บข้อมูลที่ประสบความสำเร็จและแพร่หลายมาในปัจจุบันคือ Realational database management system (RDBMS) ซึ่งเก็บข้อมูลและอ้างอิงในรูปแบบ Record กับ field หรือ row กับ column และ database management system เช่น SQL Server, Oracle ทำหน้าที่ในการจัดเก็บและเรียกข้อมูล โดยใช้ภาษามาตรฐานที่เรียกว่า Structure query language (SQL) ทำให้ผู้พัฒนา Software ทำงานง่ายขึ้นเนื่องจากไม่ต้องกังวลเรื่องการจัดเก็บข้อมูลขอให้มีพื้นฐานด้าน SQL ก็พอ


สำหรับ concept ของ RDBMS ก็ยังใช้ได้ดีสำหรับโปรแกรมประเภท Client server แต่บางครั้งจะไม่เหมาะสำหรับ application standalone หรือ โปรแกรมเล็กที่ Run บนอุปกรณ์พกพาเช่นมือถือ หรืออุปกรณ์ประเภทอื่น
บางทีเราก็เรียกว่า embeded database เนื่องจาก RDBMS ใช้ทรัพยากรของระบบเช่น หน่วยความจำ เนื่องจากบางทีต้องใช้ server หรือต้องมี process ของ DBMS อยู่ด้วย (สำหรับ embeded RDBMS ที่นิยมในปัจจุบันคือ SQLlite)

และเนื่องจากพัฒนาการของการพัฒนาโปรแกรมที่เป็น Object oriented เช่น java หรือ .Net ทำให้สำหรับโปรแกรมที่เกี่ยวของกับ database โดยมองว่าแต่ละ record ใน database เป็น Object ตัวหนี่งซึ่งเขาเรียกกระบวนการนี้ว่า Object Relation Mapping (ORM) ซึ่งโปแกรมเมอร์จะต้องเขียน function เพื่อทำการ map data กับ object (อย่างไรปัจจุบันมีคนพัฒนา tool ที่ช่วยในการทำ mapping ที่ดังๆก็คือ Hibernate ของ java) แต่การทำ ORM ก็เพิ่มความซับซ้อนและ overhead ให้กับ appplication

DB4O เป็น Object database ที่เก็บข้อมูลในรูปของ Object โดยตรง โดย DBO จะเก็บ Object ใน container เมื่อผู้ใช้เรียก object ขึ้นมาก็สามารถนำไปใช้งานได้เลย db4o ทำงานได้โคตรเร็วมากๆ เมื่อเทียบกับ RDBMS ผู้เขียนเคยพัฒนาโปรแกรมเล็กที่ทำการคำนวณกับข้อมูลในหลัก แสน record เมื่อเขียนด้วย Mysql ต้องใช้เวลาเป็นชั่วโมงเมื่อเปลี่ยนมาใช้ db4o ใช้เวลาไม่เกิน 10 นาที อย่างไรก็ตามยังไม่สามารถพูดได้ว่า db4o เร็วกว่า RDBMS เพราะขึ้นอยู่กับประเภทของงาน ทั้งนี้ ใน RDBMS จะมีกลไกเช่น Primary key contraint, check constraint, default value, trigger... ซึ่งใน db4o ไม่มีกลไกเหล่านี้ ถ้าเอา db4o ไปทำงานประเภทเดียวกับ RDBMS อาจจะช้ากว่าก็ได้เพราะผู้เขียนโปรแกรมต้องพัฒนากลไกข้างต้นเอง

ตัวอย่างเปรียบเทียบการใช้งานใช้ข้อมูล Bank account

กำหนดโครงสร้างข้อมูล

  • RDBMS:
CREATE TABLE account (First_Name char(50),Last_Name char(50), Balance float)

  • db4o
public class Account {
private String firstname, lastname;
private double balance = 0;

public void Account(String firstname, String lastname) {
this.firstname = firstname;
this.lastname = lastname;
}

public String getFirstname() {

return firstname;

}


public void setFirstname(String firstname) {

this.firstname = firstname;

}


public String getLastname() {

return lastname;

}


public void setLastname(String lastname) {

this.lastname = lastname;

}


public double getBalance() {

return balance;

}


public void setBalance(double balance) {

this.balance = balance;

}

public void deposit(double amount) {

this.balance = this.balance + amount;

}


}

การเพิ่มข้อมูล


  • RDBMS:
Class.forName(jdbcDriver);
Connection con = DriverManager.getConnection("jdbc:odbc:test","sa","password");
Statement stmt = con.createStatement();
stmt.execute("insert into account values ('somchai', 'lee', 0");



  • db4o:
ObjectContainer db = Db4o.openFile("./data.dat");
db.set(new account("somchai', 'lee');



การ update ข้อมูล


  • RDBMS:
Class.forName(jdbcDriver);
Connection con = DriverManager.getConnection("jdbc:odbc:test","sa","password");
Statement stmt = con.createStatement();
name = "somchai"
Resultset r = stmt.executequery("select balance from account where firstname = ' " + name + "' ");
r.next();
deposit = 100;
balance = r.getNumber("balance") + deposit;
stmt.exceuteUpdate("update account set balance = '" + balance + "' where
firstname = ' " + name + "' ");


  • db4o:
ObjectContainer db = Db4o.openFile("./data.dat");
name = "somchai";
Account criteria = new Account(name);
ObjectSet set = db.get(criteria);
Account acc = (Account)set.next();
deposit = 100;
acc.deposit(deposit);
db.set(acc);


จากตัวอย่างจะเห็นว่าถึงแม้ว่าการทำงานใน db40 จะดูเหมือนง่ายกว่า แต่ในข้อเท็จจริงแล้วถ้าเป็น application ที่ทำงานกับข้อมูลเช่น บัญชี หรืออื่นการทำงานใน RDBMS จะง่ายกว่าเพราะ Query จะทำงานบน set ของข้อมูลพร้อมกับ Function เช่น sum, average และ support โดย Software vendor มากกว่ามีผู้พัฒนา application และเครื่องมือที่ทำงานกับ RDBMS รวมทั่ง API ต่างๆ เช่น ADO, JDBC ช่วยให้การพัฒนาต่อยอดนำข้อมูลไปใช้ประโยชน์นั้นง่านกว่า OODBMS เช่น db4o ยังมีข้อจำกัดในเรื่องดังกล่าวเนื่องจากภาษา Query ยังไม่แพร่หลายและได้รับการสนับสนุนจาก software vendor มากนัก

db4o สามารถทำงานกับข้อมูลจำนวนมากก็จริงแต่ข้อมูลที่ไม่ซับซ้อนเช่น ระบบรายชื่อ (address book) งานด้าน simulation งานการคำนวณทางวิทยาศาตร์ รวมทั้ง application สำหรับมือถือ ตัวอย่างเช่น google ได้พัฒนา andriod เพื่อเป็นระบบปฏิบัติการสำหรับมือถือมีการพัฒนา application เช่น android password manager, andriod MapMe โดยใช้ db4o เป็นตัวจัดการข้อมูล ทั้งนี้เพราะ db4o มีจุดเด่นที่การทำงานของมันใช้ทรัพยากรเช่น หน่วยความจำและ hard disk ไม่มาก



No comments: