Assalamu'alaikum wr. wb
Sepuluh tahun yang lalu (2011) sempet membuat draft tulisan mengenai Surrogate atau Natural key yang terselip untuk diselesaikan dan dipublish.
Kali ini coba dibahasa kembali secara sekilas mengenai pemilihan kunci dalam sistem basis data relasional ini. Pemilihan kolom untuk dijadikan kunci dalam tabel basis data terkadang menjadi hal yang dilupakan.
Sebagian besar mahasiswa yang mengerjakan TA atau Skripsi yang pernah saya uji selalu menggunakan kunci primer yang digenerate oleh sistem dan umumnya digunakan sebagai surrougate key.
Jika menggunakan MYSQL maka akan menggunakan tipe data INT AUTO_INCREMENT atau jika make PostgreSQL maka tipe datanya adalah SERIAL. Tipe data serial ini sama seperti di MySQL yakni INT autoincreament juga. Jika ditanya alasan penggunaan kunci tersebut, jawabannya secara umum akan sama yakni, untuk mempermudah.
Tahun ini 2021, sebuah tabel yang dibuat dalam rangka "magang" mahasiswa dan diberikan oleh developer di lokasi kerja praktek. Saya gunakan salah satu contoh tabel tersebut, berikuyt perintah pembuatan tabel dengan PostgreSQL.
CREATE TABLE kecamatan(id SERIAL PRIMARY KEY,
kode SERIAL,
nama VARCHAR(100),
status BOOLEAN,
last_update DATE,
user_update BOOLEAN);
Tabel kecamatan di atas nampak bahwa PRIMARY KEY diatributkan pada kolom id dengan tipe data SERIAL. Selain itu kolom kode pun didefinisikan dengan menggunakan tipe data yang sama yakni SERIAL. Tipe data SERIAL merupakan INTEGER yang secara otomatis akan bertambah nilainya, seperti contoh berikut,
dataDB=> insert into kecamatan values (DEFAULT,DEFAULT,'nama kecamatan 1',TRUE,'6/3/2021',FALSE);
INSERT 0 1
dataDB=> insert into kecamatan values (DEFAULT,DEFAULT,'nama kecamatan 2',TRUE,'6/3/2021',FALSE);
INSERT 0 1
dataDB=> select * from kecamatan;
id | kode | nama | status | last_update | user_update
----+------+------------------+--------+-------------+-------------
1 | 1 | nama kecamatan 1 | t | 2021-06-03 | f
2 | 2 | nama kecamatan 2 | t | 2021-06-03 | f
(2 rows)
Nampak bahwa nilai dari id dan kode yang menggunakan tipe data SERIAL akan secara otomatis diberikan oleh sistem. Nilai indeks yang digenerate oleh PostgreSQL tersebut didefinisikan saat perintah CREATE TABLE diberikan. Sehingga jika seluruh data dihapus tanpa melakukan pembuatan ulang tabel maka indeks serialnya akan mengikuti angka terakhir dari indeksnya, kecuali dikalakukan reset.
dataDB=> truncate kecamatan ;
TRUNCATE TABLE
dataDB=> insert into kecamatan values (DEFAULT,DEFAULT,'nama kecamatan 1',TRUE,'6/3/2021',FALSE);
INSERT 0 1
dataDB=> select * from kecamatan;
id | kode | nama | status | last_update | user_update
----+------+------------------+--------+-------------+-------------
3 | 3 | nama kecamatan 1 | t | 2021-06-03 | f
(1 row)
Pemilihan tipe data ini dari sisi pembuat program nampak akan mempermudah, khususnya saat melakukan INSERT data ke tabel. Namun disisi lain akan diperlukan usaha lebih saat data berjumlah banyak dan akan melakukan query ke baris tertentu. Demikian pula dari sisi basis data maka desain tabel kecamatan tersebut lebih banyak mudharot-nya.
Beberapa kelemahan dari desain tabel kecamatan tersebut misal, perlu usaha lebih untuk menjaga tidak terjadi duplikasi, khususnya melalui program. Sebagai contoh dengan desain tabel tersebut maka sebuah kecamatan yang sama sangat mungkin memiliki id dan kode yang berbeda.
dataDB=> select * from kecamatan;
id | kode | nama | status | last_update | user_update
----+------+------------------+--------+-------------+-------------
3 | 3 | nama kecamatan 1 | t | 2021-06-03 | f
4 | 4 | nama kecamatan 1 | t | 2021-06-03 | f
5 | 5 | nama kecamatan 1 | t | 2021-06-03 | f
(3 rows)
Secara basis data denganm menggunakan perintah INSERT melalui terminal maka sangat dimungkinkan terjadi duplikasi demikian pula jika melalui program yang tidak disertai filter dalam menu inputnya. Mungkingkah menjaga agar tidak terjadi duplikasi pada tabel kecamatan tersebut dengan mengubah definisi tabelnya ? Sangat memungkinkan, tabel tersebut sekarang kiita ubah menjadi seperti berikut,
CREATE TABLE kecamatan(
kode CHAR(2) PRIMARY KEY,
nama VARCHAR(30),
status BOOLEAN,
last_update DATE,
user_update BOOLEAN);
Tabel kecamatan tersebut berubah dengan menghilangkan satu kolom (id), mengubah tipe data SERIAL pada kolom kode menjadi CHAR(2) dan nama kecamatan ke VARCHAR(30). Kenapa menggunakan tipe data CHAR(2) pada kode dan nama VACRHAR(30)? Sebuah pertanyaan yang sama, sering saya lontarkan ke mahasiswa saat menguji skripsi atau tugas akhirnya. Sebutkan alasan mengapa tipe data tersebut yang dipilih bukan yang lainnya ?
Jawaban yang sering saya dapatkan adalah bahwa " Saya merujuk dari skripsi kakak kelas pak, tipe data yang digunakan seperti itu". Dan selanjutnya saya menyampaikan " Nah kakak kelasmu dulu, waktu ujian skripsi menjawab sama persis dengan jawabanmu saat ini". Nah kalo ini dirunut jadi seperti belajar sanad hadist hehehehe.
Kembali kenapa ke CHAR(2), saat perkuliahan basis data, saya selalu menyampaikan bahwa memilih tipe data harus memiliki alasan. Dalam hal ini CHAR(2) dipilih merujuk pada kode kecamatan yang telah ada aturannya (
https://archive.org/details/permendagriindonesia722019). Bergantung nanti posisi tabel kecamatan berada di level mana, penggunaan CHAR(2) bisa digunakan untuk mewakili kode kecamatan. Bagaimana dengan nama kecamatan ? mungkin sudah bisa menebak alasannya, lebar nama ini tentu sangat bergantung dari nama-nama kecamatan yang ada di suatu kabupaten.
Dengan setiap kecamatan sudah memiliki kode sesuai dengan aturan maka desain tabel tersebut data memperkecil atau bahkan meniadakan terjadinya duplikasi data dan lebih menghemat jumlah kolom.
Semoga bisa bermanfaat
Waalaikumsalam wr wb
Komentar