Wednesday, June 28, 2006

Erlang, ลองใช้ Mnesia

Mnesia คือ database ที่เขียนด้วย erlang เพื่อ erlang
เนื่องจากเขียนด้วย erlang ,ประเด็นปัญหาเรื่อง impedance mismatch
ระหว่าง data format ของ DBMS กับ data format ของ programming language
ก็เลยไม่มี (impedance mismatch ก็คือที่มาของ Oิbject relation mapping)
feature ที่ชอบก็คือ
  • Tables can be moved or replicated to several nodes to improve fault tolerance.
  • Table locations are transparent to the programmer.


โปรแกรม Mnesia นั้น bundle มาพร้อมกับ erlang เลย
สามารถใช้งานได้ทันที ไม่ต้องติดตั้งเพิ่มเติม

การสร้าง table ใน Mnesia เริ่มต้นด้วยการ define Record Datatype
ที่จะใช้เก็บข้อมูล
-record(employee,{emp_no, 
name,
salary,
sex,
phone,
room_no}).


การสร้าง table ก็ใช้คำสั่ง
init() ->
mnesia:create_table(employee,
[{attributes, record_info(fields, employee)}]).

เวลาจะ insert ก็ใช้คำสั่ง
insert(Emp_no, Name, Salary, Sex, Phone, Room_no) ->
insert(#employee{emp_no = Emp_no,
name = Name,
salary = Salary,
sex = Sex,
phone = Phone,
room_no = Room_no}).

insert(Emp) ->
Fun = fun() ->
mnesia:write(Emp)
end,
mnesia:transaction(Fun).

Note: #employee{key = value,...} เทียบได้กับ constructor ของ Record

เวลา select ก็มีอยู่ 2 แบบ
พวก select กับ read
ลองแบบ read ก่อน (read ทั้ง record)
get(Emp) ->
Fun = fun() ->
mnesia:read({employee, Emp})
end,
mnesia:transaction(Fun).

การใช้งาน ก็เช่น
30> dbtest:get(111).
{atomic,[{employee,111,pok,2000.00,male,xxxx,412}]}

Note: read คือการดึงข้อมูลโดยใช้ key, โดยมี assumption ว่า element แรกใน record เป็น key

ส่วน select ก็ใช้ดังนี้
all_males() ->
Fun = fun() ->
Male = #employee{sex = male, name = '$1', _ = '_'},
mnesia:select(employee, [{Male, [], ['$1']}])
end,
mnesia:transaction(Fun).

Note: $1 ใช้เป็นตัวเชื่อมระหว่าง record member ที่ต้องการนำมาแสดงผลใน result list

ส่วนการ update นั้นยุ่งขึ้นมานิดหนึ่ง
เพราะ variable ใน erlang assign แล้วห้ามแก้ (immutable)
raise(Eno, Raise) -> 
F = fun() ->
[E] = mnesia:read(employee, Eno, write),
Salary = E#employee.salary + Raise,
New = E#employee{salary = Salary},
mnesia:write(New)
end,
mnesia:transaction(F).

Related link from Roti

No comments: