Berkenalan dengan ORDBMS
Pengalaman pertama dengan Oracle, dan sekaligus sebuah ORDBMS, adalah ketika mengajar lab untuk advanced database system. Oracle waktu sebelum itu nampak seperti barang mewah yang tak bisa diakses bagi kebanyakan orang (misalnya yang memilih MySQL), robust, cepat dan canggih. Ternyata sebagian dari anggapan itu hilang, sebagian lagi tetap bertahan. Oracle tidak seperti Microsoft yang menekankan aspek User Interface. Berhadapan dengan SQL*Plus, seperti berhadapan dengan makhluk langka zaman purbakala hehe. Tapi jangan salah ya, gitu-gitu, Oracle 9i (yang saya pakai di lab) termasuk database tercepat lho, sedikit mengalahkan MySQL, dalam benchmark yang ada di situs MySQL. Db2 dan yang lain-lain, performansinya turun drastis ketika sampai di titik jumlah konkuren user tertentu.
Oke, balik lagi ya ke OR-DBMS. OR adalah singkatan dari Object-Relational. Yang bermakna sebuah asimilasi dari paradigma Relational Database dan Object Database. Di ORDBMS anda bisa mendefinisikan kelas, menggunakan polimorfisme, dan lain-lain. Hanya saja, satu hal yang cukup memusingkan saya adalah bagaimana mengimplementasi sebuah many-to-many relationship di dalam ORDBMS. Browsing di dokumentasi Oracle yang sangat besar itu tidak membawa hasil berarti. Pun sekilas googling. Jangan salah, Oracle 9i mampu mengimplementasi many to many relationship a-la Relational lho, sebab sifatnya yang Object-Relational. Tapi, karena kuliahnya nyerempet-nyerempet tentang object database, ya agak aneh juga kalau segala sesuatunya diselesaikan dengan cara relational.
Solusinya harus melibatkan referensi, saya pikir begitu. Sebagai informasi, dalam paradigma object database, kita tidak melink-kan antar object dengan foreign key, tapi dengan Object ID. Masing-masing object secara otomatis akan memiliki Object ID yang bisa digunakan untuk keperluan referensi dari object lain. Dalam paradigma relational, kita akan berhadapan dengan join. Semakin banyak tabel terlibat, semakin banyak join yang kita buat. Dalam aplikasi yang memiliki relasi yang kompleks antar-objek, menggunakan RDBMS menjadi kurang tepat. Mengapa? Karena relasi kompleks antar objek itu cenderung berimplikasi ke banyaknya join yang harus dilakukan dalam query. Semakin banyak join, semakin banyak cartesian multiplication yang terjadi antar tabel, semakin lambat pula RDBMS beraksi.
Sebagai kontras, di dalam paradigma Objek Database, keunggulannya adalah pada object navigation. Dari objek satu ke objek lain, kita melakukan navigasi dengan bantuan OID tersebut. Kita tidak melakukan join antar tabel, sehingga umumnya akan mempercepat proses. Sekali lagi, ini berlaku untuk kasus relasi kompleks antar-objek (contoh aplikasi engineering dan manufacturing), dan bukan pada kasus relasi sederhana antara objek yang volume datanya besar (contoh aplikasi perbankan).
Kembali ke many-to-many relationship. Menurut buku Database Systems, relasi tersebut bisa digambarkan dengan menyimpan tabel referensi ke intermediate object. Sebagai contoh, kita hendak menggambarkan hubungan many to many antara Resep dan Bahan. Kita tahu bahwa setiap Resep (makanan) terdiri atas beberapa bahan, dan sebuah bahan bisa muncul dalam beberapa resep. Nah, misalnya anda diminta untuk menyimpan beberapa resep berikut dalam ORDBMS:
Resep2:Kentang Goreng
Bahan,Kuantitas
-Kentang,2 kg
-Minyak,0.2 L
-Garam,200 gram
-Tepung,400 gram
Maka, solusinya kira-kira begini gambarnya:

Dan kode implementasinya seperti ini:
create type rec_ing_t;
create type ref_t as object (
refs REF rec_ing_t
);
create or replace type rec_ing_ctr as TABLE of ref_t;
create type rec_t;
create_type ing_t;
create or replace type rec_ing_t as object (
rec REF rec_t,
ing REF ing_t,
quantity varchar2(40)
);
create or replace type ing_t as object
(
name varchar2(40) ,
recipees rec_ing_ctr
);
create or replace type rec_t as object
(
name varchar2(40),
ingredients rec_ing_ctr
);
create table rec_tab of rec_t nested table ingredients store as ing_store;
create table ing_tab of ing_t nested table recipees store as rec_store;
create table rec_ing_tab of rec_ing_t;
insert into rec_tab(name) values ('ayam goreng');
insert into rec_tab(name) values ('kentang goreng');
insert into ing_tab(name) values ('ayam');
insert into ing_tab(name) values ('oil');
insert into ing_tab(name) values ('kentang');
insert into ing_tab(name) values ('salt');
select L.* from rec_tab, table (rec_tab.ingredients) L;
# memasukkan resep berikut
# Ayam Goreng consist of 1 kg ayam, 100 ml oil, 100 gr salt
insert into rec_ing_tab values (
(select ref(r) from rec_tab r where r.name='ayam goreng'),
(select ref(i) from ing_tab i where i.name ='ayam'),
'1 kg'
);
insert into rec_ing_tab values (
(select ref(r) from rec_tab r where r.name='ayam goreng'),
(select ref(i) from ing_tab i where i.name ='oil'),
'100 ml'
);
insert into rec_ing_tab values (
(select ref(r) from rec_tab r where r.name='ayam goreng'),
(select ref(i) from ing_tab i where i.name ='salt'),
'100 g'
);
select deref(r.rec) from rec_ing_tab r;
select r.rec from rec_ing_tab r;
select r.rec.name from rec_ing_tab r;
select r.ing.name from rec_ing_tab r;
UPDATE rec_tab r SET r.ingredients = rec_ing_ctr();
insert into table ( select R.ingredients from rec_tab R where R.name='ayam goreng')
select ref(RI) from rec_ing_tab RI where RI.rec.name = 'ayam goreng';
UPDATE ing_tab I SET I.recipees = rec_ing_ctr();
insert into table ( select I.recipees from ing_tab I where I.name='ayam')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'ayam';
insert into table ( select I.recipees from ing_tab I where I.name='oil')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'oil';
insert into table ( select I.recipees from ing_tab I where I.name='salt')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'salt';
#apakah ingredient dari masing-masing resep?
select R.name,I.refs.ing.name,I.refs.quantity from rec_Tab R,table(R.ingredients) I;
UPDATE rec_tab r SET r.ingredients = rec_ing_ctr();
insert into table ( select R.ingredients from rec_tab R where R.name='ayam goreng')
select ref(RI) from rec_ing_tab RI where RI.rec.name = 'ayam goreng';
UPDATE ing_tab I SET I.recipees = rec_ing_ctr();
insert into table ( select I.recipees from ing_tab I where I.name='ayam')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'ayam';
insert into table ( select I.recipees from ing_tab I where I.name='oil')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'oil';
insert into table ( select I.recipees from ing_tab I where I.name='salt')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'salt';
Oke, balik lagi ya ke OR-DBMS. OR adalah singkatan dari Object-Relational. Yang bermakna sebuah asimilasi dari paradigma Relational Database dan Object Database. Di ORDBMS anda bisa mendefinisikan kelas, menggunakan polimorfisme, dan lain-lain. Hanya saja, satu hal yang cukup memusingkan saya adalah bagaimana mengimplementasi sebuah many-to-many relationship di dalam ORDBMS. Browsing di dokumentasi Oracle yang sangat besar itu tidak membawa hasil berarti. Pun sekilas googling. Jangan salah, Oracle 9i mampu mengimplementasi many to many relationship a-la Relational lho, sebab sifatnya yang Object-Relational. Tapi, karena kuliahnya nyerempet-nyerempet tentang object database, ya agak aneh juga kalau segala sesuatunya diselesaikan dengan cara relational.
Solusinya harus melibatkan referensi, saya pikir begitu. Sebagai informasi, dalam paradigma object database, kita tidak melink-kan antar object dengan foreign key, tapi dengan Object ID. Masing-masing object secara otomatis akan memiliki Object ID yang bisa digunakan untuk keperluan referensi dari object lain. Dalam paradigma relational, kita akan berhadapan dengan join. Semakin banyak tabel terlibat, semakin banyak join yang kita buat. Dalam aplikasi yang memiliki relasi yang kompleks antar-objek, menggunakan RDBMS menjadi kurang tepat. Mengapa? Karena relasi kompleks antar objek itu cenderung berimplikasi ke banyaknya join yang harus dilakukan dalam query. Semakin banyak join, semakin banyak cartesian multiplication yang terjadi antar tabel, semakin lambat pula RDBMS beraksi.
Sebagai kontras, di dalam paradigma Objek Database, keunggulannya adalah pada object navigation. Dari objek satu ke objek lain, kita melakukan navigasi dengan bantuan OID tersebut. Kita tidak melakukan join antar tabel, sehingga umumnya akan mempercepat proses. Sekali lagi, ini berlaku untuk kasus relasi kompleks antar-objek (contoh aplikasi engineering dan manufacturing), dan bukan pada kasus relasi sederhana antara objek yang volume datanya besar (contoh aplikasi perbankan).
Kembali ke many-to-many relationship. Menurut buku Database Systems, relasi tersebut bisa digambarkan dengan menyimpan tabel referensi ke intermediate object. Sebagai contoh, kita hendak menggambarkan hubungan many to many antara Resep dan Bahan. Kita tahu bahwa setiap Resep (makanan) terdiri atas beberapa bahan, dan sebuah bahan bisa muncul dalam beberapa resep. Nah, misalnya anda diminta untuk menyimpan beberapa resep berikut dalam ORDBMS:
Resep1: Ayam Goreng
Bahan,Kuantitas:
-Ayam,1 kg
-Minyak,0.5 L
-Garam,150 gram
-Tepung,250 gram
Resep2:Kentang Goreng
Bahan,Kuantitas
-Kentang,2 kg
-Minyak,0.2 L
-Garam,200 gram
-Tepung,400 gram
Maka, solusinya kira-kira begini gambarnya:

Dan kode implementasinya seperti ini:
create type rec_ing_t;
create type ref_t as object (
refs REF rec_ing_t
);
create or replace type rec_ing_ctr as TABLE of ref_t;
create type rec_t;
create_type ing_t;
create or replace type rec_ing_t as object (
rec REF rec_t,
ing REF ing_t,
quantity varchar2(40)
);
create or replace type ing_t as object
(
name varchar2(40) ,
recipees rec_ing_ctr
);
create or replace type rec_t as object
(
name varchar2(40),
ingredients rec_ing_ctr
);
create table rec_tab of rec_t nested table ingredients store as ing_store;
create table ing_tab of ing_t nested table recipees store as rec_store;
create table rec_ing_tab of rec_ing_t;
insert into rec_tab(name) values ('ayam goreng');
insert into rec_tab(name) values ('kentang goreng');
insert into ing_tab(name) values ('ayam');
insert into ing_tab(name) values ('oil');
insert into ing_tab(name) values ('kentang');
insert into ing_tab(name) values ('salt');
select L.* from rec_tab, table (rec_tab.ingredients) L;
# memasukkan resep berikut
# Ayam Goreng consist of 1 kg ayam, 100 ml oil, 100 gr salt
insert into rec_ing_tab values (
(select ref(r) from rec_tab r where r.name='ayam goreng'),
(select ref(i) from ing_tab i where i.name ='ayam'),
'1 kg'
);
insert into rec_ing_tab values (
(select ref(r) from rec_tab r where r.name='ayam goreng'),
(select ref(i) from ing_tab i where i.name ='oil'),
'100 ml'
);
insert into rec_ing_tab values (
(select ref(r) from rec_tab r where r.name='ayam goreng'),
(select ref(i) from ing_tab i where i.name ='salt'),
'100 g'
);
select deref(r.rec) from rec_ing_tab r;
select r.rec from rec_ing_tab r;
select r.rec.name from rec_ing_tab r;
select r.ing.name from rec_ing_tab r;
UPDATE rec_tab r SET r.ingredients = rec_ing_ctr();
insert into table ( select R.ingredients from rec_tab R where R.name='ayam goreng')
select ref(RI) from rec_ing_tab RI where RI.rec.name = 'ayam goreng';
UPDATE ing_tab I SET I.recipees = rec_ing_ctr();
insert into table ( select I.recipees from ing_tab I where I.name='ayam')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'ayam';
insert into table ( select I.recipees from ing_tab I where I.name='oil')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'oil';
insert into table ( select I.recipees from ing_tab I where I.name='salt')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'salt';
#apakah ingredient dari masing-masing resep?
select R.name,I.refs.ing.name,I.refs.quantity from rec_Tab R,table(R.ingredients) I;
UPDATE rec_tab r SET r.ingredients = rec_ing_ctr();
insert into table ( select R.ingredients from rec_tab R where R.name='ayam goreng')
select ref(RI) from rec_ing_tab RI where RI.rec.name = 'ayam goreng';
UPDATE ing_tab I SET I.recipees = rec_ing_ctr();
insert into table ( select I.recipees from ing_tab I where I.name='ayam')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'ayam';
insert into table ( select I.recipees from ing_tab I where I.name='oil')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'oil';
insert into table ( select I.recipees from ing_tab I where I.name='salt')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'salt';


0 Comments:
Post a Comment
<< Home