Jumat, 14 Desember 2012

Belajar MySQL Untuk Pemula

8 Hal Yang Harus Diketahui Programer Pemula Tentang MySQL
PHP+MySQL. Siapa yang tidak tahu bahwa duo sejoli ini adalah pasangan terpopular di dunia open source, bahkan di seluruh Internet. PHP telah menggeser Perl sebagai bahasa pilihan dalam membuat aplikasi Web, terutama bagi pemula. Dan PHP hampir selalu bersanding dengan MySQL;

90–95%+ skrip PHP di http://www.hotscripts.com/ mungkin bertuliskan “membutuhkan PHP dan MySQL”. Buku-buku PHP, termasuk untuk pemula, tidak akan dipandang afdol kalau belum membahas MySQL. Dan programer PHP, lambat atau cepat, mau atau tidak mau, pasti akan harus mengakrabi software database yang satu ini.

Sayangnya, banyak programer sudah bermain-main dan memakai MySQL secara live di situs produksi, padahal masih asing sama sekali dengan konsep database relasional. Bahkan sebetulnya MySQL juga banyak memiliki kekurangan dalam hal fitur SQL. Sehingga programer PHP tidak bisa memahami dan memanfaatkan kekuatan penuh database relasional + SQL.

Buat Anda para programer pemula yang memang masih awam dengan MySQL dan konsep database pada umumnya, tidak perlu minder atau khawatir. Di dunia IT yang bergerak serba cepat ini memang ada terlalu banyak hal yang harus dipelajari. Dan kebanyakan jadinya dipelajari sambil jalan, sambil dipraktikkan. Ketika mulai membangun CMS untuk satunet.com tahun 1999 pun, saya hanya punya skill terbatas tentang SQL: 

hanya tahu SELECT, UPDATE, DELETE, CREATE TABLE, dan DROP TABLE. Apa itu JOIN, bagaimana mengubah skema tabel, bagaimana mendesain database yang baik dan ternormalisasi, semuanya masih blank. Dan semua harus dipelajari sambil jalan. Tapi toh akhirnya semua baik-baik saja.

Lewat artikel ini kita akan membahas hal-hal dasar apa yang perlu diketahui agar bisa memakai MySQL dengan efektif dan efisien. Mari kita mulai dengan hal nomor satu:

1. Tabel MySQL bukanlah array

Programer PHP atau Perl tentu saja familiar dengan array dan hash, yang biasanya dipakai untuk menyimpan sekumpulan data terkait. Sebagian dari mereka yang tidak familiar dengan MySQL akan cenderung menganalogikan tabel database dengan array/hash (tepatnya, array of array atau array 2 dimensi). Tabel dipandang sama seperti sebuah array, hanya saja bisa
berukuran besar sekali dan persisten (disimpan di disk).
 
Cara pandang ini tidak sepenuhnya salah, karena toh dalam mengambil record dari tabel biasanya ditampung ke dalam variabel array/hash. Hanya saja, cara pandang ini kadang-kadang membuat programer PHP melakukan sesuatu seperti:

$res = mysql_query(“SELECT * FROM t1″);$rows = array();while ($row = mysql_fetch_row($res)) $rows[] = $row;echo “Jumlah record di tabel t1 = “, count($rows);

atau membuat tabel seperti:

CREATE TABLE t2 ( f0 INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, f1 INT UNSIGNED, f2 VARCHAR(5), f3 VARCHAR(200), f4 VARCHAR(200), f5 BLOB);

Apa yang salah dengan kode PHP pertama di atas, yang bertujuan mencari jumlah record dalam sebuah tabel? Si programer, yang terlalu terobsesi menganggap tabel MySQL sebagai sebuah array, mencoba membangun dulu arraynya dengan mengisi satu-persatu elemen dari hasil query agar nantinya bisa menggunakan fungsi array count(). Masalahnya, bagaimana kalau jumlah record ada 100 ribu? 1 juta? 10 juta? Bukan itu saja, selesai di-count() variabel $rows langsung dibuang lagi! Padahal, ada cara yang jauh lebih efisien:

SELECT COUNT(*) FROM t1

Hasil querynya hanyalah sebuah record saja, tak peduli berapa pun ukuran tabel t1. Lalu apa yang salah dengan kode SQL kedua? Si programer Perl, dalam hal ini, terobsesi ingin mengambil tiap record di tabel dengan fungsi DBI

$sth->fetchrow_array(@row = $sth->fetchrow_array();print $row[0]; # f0print $row[1]; # f1print $row[2]; # f2# …

Enak bukan? Elemen ke-0 berisi nilai field f0, elemen ke-1 field f1, dst. Masalahnya, kemudahan ini mengorbankan nama field yang menjadi sangat tidak deskriptif. Belum lagi kalau tabel perlu diubah dengan menyisipkan field-field lain di antara field yang sudah ada. Atau field-field lama perlu dihapus. Semuanya akan menjadi mimpi buruk.

Sebagian pembaca mungkin geleng-geleng kepala. Apa benar ada programer PHP dan Perl yang melakukan kedua hal di atas? Percaya deh, ada. Saya pernah harus ketiban getah memaintain tabel dengan nama field kriptik seperti ini.

2. Bahasa SQL dan Fungsi-Fungsi MySQL

MySQL adalah database SQL bukan? Sayangnya, programer PHP pemula kadang terbatas sekali pengetahuan SQL-nya. Padahal, untuk menggunakan database MySQL dengan efektif, ia tidak boleh malas mempelajari bahasa kedua, yaitu SQL. Jika tidak belajar SQL, maka ada kemungkinan Anda akan melakukan hal-hal seperti:

$res = mysql_query(“SELECT * FROM bigtable”);while ($row =mysql_fetch_assoc($res)) { if ($row['age'] >= 40) { echo “Ditemukan kustomer yang berusia lebih dari 40 tahun!\n”; break; }}

Apa salah kode di atas? Si programer PHP mencoba mensimulasikan klausa WHERE SQL dengan melakukan pengujian kondisi di kode PHP. Padahal, yang seharusnya dilakukan adalah :
 
SELECT * FROM bigtable WHERE age >= 40

Ini amat mengirit trafik client/server karena tidak semua record harus dikirimkan dari MySQL ke program PHP And Sebagian pembaca mungkin geleng-geleng kepala. Apa benar ada programer PHP yang seperti ini? Percaya deh, ada. SQL sudah menyediakan cara untuk menyortir data, memformat tampilan, mengelompokkan dan memfilter record, dsb. MySQL juga terkenal banyak menyediakan fungsi-fungsi, mulai dari manipulasi tanggal, angka, string, dsb. Kenali SQL dan fungsi-fungsi MySQL; jangan duplikasikan ini semua di PHP sebab akan lebih efisien jika dilakukan di level MySQL Ini contoh lain programer PHP yang tidak memanfaatkan fasilitas dari MySQL:

$res = mysql_query(“SELECT * FROM customers”);while ($row = mysql_fetch_assoc($res)) { # format semula yyyy-mm-dd…preg_match(“/(\d\d\d\d)-(\d\d?)-(\d\d?)/”, $row[date], $matches); # … dan ingin dijadikan dd/mm/yyyy $tanggal = “$matches[3]/$matches[2]/$matches[1]“; echo “Nama=$row[name], Tanggal lahir=$tanggal \n”;}
 
Padahal MySQL sudah menyediakan fungsi pemformatan dan manipulasi tanggal 

$res = mysql_query(“SELECT name, DATE_FORMAT(date,’%d-%m-%Y’) as tanggal “. “FROM customers”);while ($row = mysql_fetch_assoc($res)) { # tidak perlu capek-capek manipulasi string lagi… echo “Nama=$row[name], Tanggal lahir=$row[tanggal] \n”;}

Poin no. 2 ini kedengarannya klise, tapi, seperti nasihat Inggris bilang: know thy tools.
comments powered by Disqus