Abstraction Layer atau lapisan abstraksi adalah suatu lapisan untuk menyembunyikan kerumitan yang ada pada fungsi-fungsi yang serupa. Begitu pula dengan Database Abstraction Layer, suatu pendekatan penyederhanaan/penyeragaman fungsi dari setiap database engine yang ada, jadi kita tidak perlu mengetahui fungsi API database spesifik yang kita gunakan, yang perlu kita ketahui hanyalah fungsi API dari Database Abstraction Layer yang kita gunakan. Terkesan sederhana. Ya, memang ini menjadikan pekerjaan programmer sederhana.
Mungkin selama ini anda pernah mendengar ODBC, khususnya bagi anda pengguna Windows, karena memang pada awalnya ODBC muncul di sistem operasi ini. ODBC adalah salah satu dari berbagai jenis Database Abstraction Layer yang ada. Jenis lainnya adalah ORM, di PHP tersedia ActiveRecord, Doctrine, dll; di Java ada Hibernate, dll. Juga ada jenis yang lebih sederhana, seperti pada PHP ada PDO(PECL), atau PEAR DB(PEAR).
Dengan pendekatan ini, para programmer akan semakin mudah dalam menghubungkan aplikasi yang mereka buat dengan database, tapi harus kita ingat bahwa setiap pemecahan masalah akan selalu menimbulkan masalah baru. Memang benar bahwa dengan menggunakan Doctrine, kita tidak perlu mengkhawatirkan engine database apa yang kita gunakan, kita bisa menggunakan postgreSQL, MySQL, MSSQL, ataupun juga Oracle; dengan menggunakan Hibernate kita hanya perlu menggunakan fungsi API hibernate saja. Tapi, dengan adanya abstraction layer, artinya ada rutin fungsi lain yang dijalankan, ya, dengan itu berarti aplikasi jadi yang kita buat bisa menjadi lebih lambat dalam mengakses data :(, sayang sekali…
Contohnya mungkin pada skrip php yang menggunakan PDO berikut ini:
<?php // tentukan $dsn, $username dan $password $dsn = "mysql:host=localhost;dbname=telepon"; $username = "user"; $passwd = "password"; try{ $pdo = new PDO($dsn, $username, $passwd); $runq = $pdo->query("SELECT * FROM akun a, telepon t WHERE a.id=t.id_akun"); foreach ($runq as $row){ echo $row['nama']." ".$row['telepon']."<br/>"; } }catch(PDOException $e){ echo $e->getMessage(); } ?>
Ini dia, lihat pada $dsn, disini $dsn bisa diganti dengan driver lain yang disupport oleh PDO, kita bisa mengubahnya menjadi mssql ataupun yang lainnya. Untuk menjalankan query, kita hanya perlu menjalankan $pdo->query($sql), dan lakukan iterasi untuk memunculkan hasilnya.
Namun, lihat pada objek PDO, objek ini menerima berbagai masukan jenis database engine yang ada, tapi mengeluarkan hasil yang sama, artinya ada sesuatu yang kompleks yang terjadi di dalam fungsi objek ini, dan tentunya itu akan makan waktu, yang berharga untuk setiap permintaan query user :(.
Dengan rangkuman bahwa Database Abstraction Layer memiliki:
Kelebihan
- Waktu pengembangan (yang perlu dilakukan developer hanya mengetahui fungsi DBAL saja)
- Tidak perlu mengkhawatirkan database engine (selama driver terpenuhi, maka fungsi DBAL akan berjalan sesuai keinginan)
Kekurangan
- Waktu (karena DBAL menjalankan rutin fungsi yang lebih banyak daripada fungsi native yang disediakan, tentunya waktu query jadi lebih lambat)
- Fungsi Kompleks Spesifik Engine (mengingat DBAL ini fungsinya untuk menyeragamkan fungsi dan hasil, kita tidak akan menemukan kelebihan spesifik (fungsi kompleks) dari engine database. misal: pengoptimasian query, karena tidak semua database engine menyediakan cara untuk optimasi query (lewat index), jadi DBAL-pun tidak menyertakannya)
dan, itulah garis besar dari database abstraction layer.
ActiveRecord itu aslinya dari Ruby On Rails. PHP cuman mengimplementasikan dengan behaviour yang mirip.. 🙂
tepat sekali kang, tapi karena saya hanya mencontohkan di PHP, jadi tidak apa kan 🙂
Untuk PHP memang nyata banget terjadi penurunan performance.
Tapi di java beda lagi.. 😀 justru sebaliknya, si rdbms ga terus-terusan digeber. Aku baru tau sekarang kenapa Hibernate dikasih nama Hibernate, karena memang cara kerjanya mirip dengan saat kita nge hibernate komputer.
jelas ta, karena di php yang dilakukan cuma kurang lebih penyederhanaan fungsi dan cache saja, tapi ga begitu powerful seperti di java 😀
nice info gan 😀
nice inpoh gan…
mirip penggunaan API Fac…eh boleh sebut merek gak nih?..heu
penambahan layer bisa ngurangin kebutuhan waktu buat ngembangin aplikasi “ber-database”, tapi kalo masalah kompleksitas karena nambah layer gimana ya gan?
Mohon penjelasannya nih, maklum masih newbie 😀
sip naw…ay…di, ah, sip deh di! 😀
iya, memang kurang lebih mirip dengan facebook API, khususnya FQL, tapi karena server facebook ada ribuan lebih maka loading timenya jadi terasa seperti langsung dari server sendiri. Penambahan layer ini tergantung metode yang dipakai, kalau hanya kumpulan fungsi untuk menyederhanakan perintah saja sepertinya akan terjadi penurunan performa yang cukup berarti. Sedangkan berbeda jika seperti yang dikatakan saudara ata sebelumnya, bahwa hibernate memiliki rutin khusus agar operasi fetch database menjadi lebih cepat. Yah, sebenarnya saya belum coba sih 😀
Eh, ngomong-ngomong saia coba melakukan test sederhana untuk INSERT data sederhana pada MySQL (engine InnoDB), berikut codenya:
native:
pakai PDO:
Dilakukan masing-masing tiga kali testing, dan hasilnya:
native:
0.38668704032898
0.42286705970764
0.4378080368042
PDO:
0.42233490943909
0.43034291267395
0.39354610443115
Kerena masih penasaran, saya lakukan ujicoba lagi, namun kali menggunakan Transaction
native-nya
POD-nya
dan Hasilnya:
native with Transaction:
0.11872601509094
0.13377690315247
0.10277199745178
PDO with Transaction:
0.11157703399658
0.11124014854431
0.10987615585327
Kalau yang tadi masih tanpa melalui tahap pengamanan dari SQL Injection, sekarang udah pakai escape:
native-nya:
POD-nya:
dan Hasilnya:
native with escape
0.13209915161133
0.12799215316772
0.12457489967346
PDO include escape
0.12290501594543
0.12156391143799
0.12350106239319
So bedanya dimana? Mending yang mana? Dengan perbedaan waktu eksekusi yang amat sangat tipis. Saya sih milih pakai PDO, code jadi lebih rapih. Toh sama cepatnya
O ya, saia melakukan ujicoba di:
– OS: Linux 2.6.26-1-686 (GNU/Linux Debian Lenny)
– Apache 2.2
– PHP 5.3
BTW, sekalian mu promosi, saia coba melakukan very simple implementation active record untuk PHP:
Codenya:
http://github.com/ata/active-record
Tutorialnya:
http://wiki.ostric.org/php/intermediate/active-record
Bangun oy…
menarik juga, setelah dilihat hasilnya ternyata bahkan PDO bisa lebih cepat pada penggunaan transaction dan escape, mungkin hal ini disebabkan karena tidak seperti PEAR yang merupakan kelas fungsi php saja, PDO merupakan native library (*.dll, *.so), jadi berjalan setingkat lebih tinggi.
Akhirnya, fungsi mysql native dihasilkan lewat native library, juga PDO mysql dihasilkan lewat native driver, sehingga mungkin karena itu perbedaan performa tidak begitu terlihat.
BTW, sekalian mu promosi, saia coba melakukan very simple implementation active record untuk PHP:
Codenya:
http://github.com/ata/active-record
Tutorialnya:
http://wiki.ostric.org/php/intermediate/active-record