เนื่องจากเขียนด้วย 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).
No comments:
Post a Comment