Struktur Database yang Tidak Menyusahkan Anda Tahun Depan
Hampir semua migrasi menyakitkan yang pernah saya kerjakan berakar pada keputusan kecil di minggu pertama proyek.
Simpan snapshot pada baris transaksi
Baris order_items harus menyimpan nama produk, versi, dan harga saat itu — bukan hanya product_id. Harga berubah, produk diarsipkan, nama diperbaiki. Invoice dua tahun lalu harus tetap bisa dibaca persis seperti saat diterbitkan.
Uang disimpan sebagai integer
Untuk rupiah, simpan sebagai unsignedBigInteger dalam satuan penuh. Tidak ada pecahan sen yang perlu dikhawatirkan, dan Anda terbebas dari kejutan floating point.
Enum sebagai string, bukan enum MySQL
Kolom ENUM di MySQL butuh ALTER TABLE setiap kali ada nilai baru — operasi yang mengunci tabel besar. Gunakan string(32) dan validasi di level aplikasi lewat PHP enum.
Index mengikuti query, bukan firasat
Jangan memasang index di setiap kolom. Jalankan EXPLAIN pada query yang benar-benar Anda pakai, lalu buat composite index sesuai urutan kolom pada WHERE dan ORDER BY. Index yang tidak terpakai memperlambat setiap operasi tulis.
Soft delete hanya untuk yang benar-benar perlu
Produk dan pesanan: ya, karena riwayat harus utuh. Baris pivot dan log: tidak — mereka hanya akan menumpuk dan memperlambat query.
Butuh implementasinya di bisnis Anda?
Kami bantu dari analisa sampai deployment.