
Bayangin Budi Mengganti Nama Kolom Langsung di Production...
Bayangin Budi merasa nama kolom nama di tabel users kurang jelas, dan ingin menggantinya menjadi full_name. Karena terburu-buru, Budi langsung menjalankan satu perintah di database production:
ALTER TABLE users RENAME COLUMN nama TO full_name;Query-nya sukses dalam sepersekian detik. Tapi detik berikutnya, seluruh API Budi mulai melempar error column "nama" does not exist secara massal — karena kode aplikasi yang sedang berjalan di server (yang belum sempat di-deploy ulang dengan kode terbaru) masih menulis query SELECT nama FROM users. Database dan kode aplikasi jadi tidak sinkron selama beberapa menit yang menyakitkan.
Masalahnya: Perubahan Skema dan Perubahan Kode Tidak Pernah Terjadi di Detik yang Persis Sama
Proses deployment aplikasi modern (apalagi dengan banyak instance/container) selalu punya jeda: migrasi database dijalankan duluan, baru kode baru menyusul menyala satu per satu. Kalau migrasi langsung menghapus atau mengubah nama sesuatu yang masih dipakai kode versi lama, akan selalu ada jendela waktu di mana keduanya bentrok.
Nah, Di Sinilah Pola 'Expand-Contract Migration' Masuk!
Alih-alih mengubah dalam satu langkah, ubah skema secara bertahap dalam beberapa kali deploy terpisah:
- Expand (Perluas): Tambahkan kolom baru
full_nametanpa menghapus kolom lamanama. Deploy kode yang menulis ke kedua kolom sekaligus setiap kali ada perubahan data, sambil masih membaca dari kolom lama. Database sekarang punya dua kolom yang isinya sinkron. - Migrate (Pindahkan data lama): Jalankan skrip satu kali untuk menyalin data historis dari
namakefull_nameuntuk baris-baris yang sudah ada sebelum kolom baru ditambahkan. - Contract (Persempit): Setelah yakin semua instance aplikasi sudah memakai kode terbaru yang membaca dari
full_name, deploy versi kode yang berhenti menyentuhnamasama sekali. - Cleanup: Barulah di migrasi terpisah berikutnya, kolom
namayang sudah benar-benar tidak dipakai boleh dihapus denganDROP COLUMN.
Intinya: Setiap kali sebuah kolom atau tabel masih mungkin dibaca oleh kode versi lama yang sedang berjalan, jangan pernah menghapus atau me-rename-nya secara langsung. Tambah dulu yang baru, pastikan semua kode sudah pindah, baru bersihkan yang lama — proses yang lebih lama, tapi tidak ada satu pun pengguna yang merasakan downtime.
Mau langsung pakai template?
Jelajahi template gratis dan premium di TampilKit untuk mempercepat proses development project kamu.
Browse Templates