Apa itu Schema Migration?
Schema migration adalah cara mengelola perubahan struktur database secara terstruktur dan version-controlled. Setiap perubahan dicatat sebagai file migration yang bisa dijalankan (up) atau di-rollback (down).
Mengapa Migration?
- Version control — perubahan schema bisa di-track di git
- Tim kolaborasi — semua developer punya schema yang sama
- Reproducible — bisa rebuild database dari nol
- Rollback — bisa undo perubahan jika ada masalah
Contoh Migration (Laravel)
// Migration: create_products_table
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->decimal('price', 10, 2);
$table->text('description')->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('products');
}
Migration Best Practices
1. Additive Changes (Aman)
-- Menambah kolom baru (aman, backward compatible)
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- Menambah index (aman, tapi bisa lambat untuk tabel besar)
CREATE INDEX CONCURRENTLY idx_users_phone ON users(phone);
2. Destructive Changes (Hati-hati)
-- Menghapus kolom (data hilang permanen!)
ALTER TABLE users DROP COLUMN phone;
-- Mengubah tipe data (bisa gagal jika data tidak kompatibel)
ALTER TABLE users ALTER COLUMN age TYPE SMALLINT;
3. Zero-Downtime Migration Pattern
-- Step 1: Tambah kolom baru (deploy 1)
ALTER TABLE users ADD COLUMN email_new VARCHAR(255);
-- Step 2: Backfill data (background job)
UPDATE users SET email_new = LOWER(email);
-- Step 3: Switch kode untuk pakai kolom baru (deploy 2)
-- Step 4: Hapus kolom lama (deploy 3)
ALTER TABLE users DROP COLUMN email;
ALTER TABLE users RENAME COLUMN email_new TO email;