MySQL Auto Increment vs PostgreSQL Sequence untuk Distributed System

Di semua engine database yang  pernah saya pakai, ada fasilitas untuk membuat sebuah baris data unik dengan cara selalu menambahkan angka secara otomatis dari baris sebelumnya. Biasanya menambahkan 1 dari sebelumnya, walaupun sebenarnya tidak harus tambah 1, bisa tambah 2,5, 10, dan seterusnya. Demikian juga dengan database populer seperti MySSQL dan PostgreSQL yang biasa saya pakai. Di MySQL namanya AUTO INCREMENT sedangkan di PostgreSQL namanya SEQUENCE.

Saya tidak akan menjelaskan bagaimana membuatnya, namun saya ingin menyampaikan pendapat pribadi bahwa SEQUENCE di PostgreSQL lebih “keren” dari pada AUTO INCREMENT di MySQL untuk implementasi sistem yang terdistribusi di mana setiap node server bisa menulis baris data sendiri dan di-broadcast ke node yang lainnya. Diperlukan cara agar tidak bentrok nilainya antara node satu dengan node lainnya.

Pendekatan yang sering dipakai adalah dengan membedakan start dan step increment-nya. Misalnya:

  • Node 1: dimulai dari 1 dan step incrementnya 10, artinya akan menghasilkan angka 1, 11, 21, 31, 41, dst.
  • Node 2: dimulai dari 2 dan step incrementnya 10, sehingga akan menghasilkan angka 2,12, 22, 31, 41, dst.

Dengan pendekatan tersebut di atas maka antara node 1 dan node 2 tidak akan bentrok nilainya.

Di MySQL hal tersebut hanya bisa dilakukan dengan melakukan setting di konfigurasi server atau di variable global yang akan mempengaruhi semua database dan tabel yang ada. Di PostgreSQL bisa di-setting di sebuah object sequence sendiri.

bagaimana kalau node nya lebih dari 10? bagaimana kalau lebih dari 100? lebih dari 1000? Maka step increment nya jadi semakin lebar. Ini bisa cepat menghabiskan digit angka. Mungkin untuk record database yang sedikit tidak masalah. Tapi kalau menatat jutaan record setiap hari bagaimana?

Saya tidak suka dengan pendekatan tersebut.  Saya lebih suka menggunakan key lain yang alhanumeric, misalnya UUID, atau microtime + random number yang harus digabung dengan ID dari node. Dengan demikian, akan selalu unik entah dari node mana record berasal.

Namun ada kalanya kita memang harus membuat sebuah key yang berupa angka, misalnya untuk transaksi pembayaran di bank, di mana di ATM tidak bisa input huruf untuk nomor pembayarannya. Untuk itu, SEQUENCE dari PostgreSQL lebih enak digunakan.

bagimana bisa? Lanjut nanti…