Saya pikir ada dua bagian untuk masalah ini.
Pertama adalah mengelola skema database dan perubahannya. Kami melakukan ini menggunakan South, menyimpan model kerja dan file migrasi di repositori SCM kami. Untuk keamanan (atau paranoia), kami membuang database sebelum (dan jika kami benar-benar takut, setelah) menjalankan migrasi apa pun. Selatan telah memadai untuk semua kebutuhan kami sejauh ini.
Kedua adalah menerapkan perubahan skema yang lebih dari sekadar menjalankan file migrasi yang dihasilkan oleh South. Dalam pengalaman saya, perubahan pada database biasanya memerlukan perubahan pada kode yang digunakan. Jika Anda bahkan memiliki web farm kecil, menjaga agar kode yang diterapkan tetap sinkron dengan versi skema database Anda saat ini mungkin tidak sepele - ini akan menjadi lebih buruk jika Anda mempertimbangkan lapisan dan efek caching yang berbeda pada pengguna situs yang sudah aktif. Situs yang berbeda menangani masalah ini secara berbeda, dan saya rasa tidak ada jawaban yang cocok untuk semua.
Memecahkan bagian kedua dari masalah ini tidak selalu langsung. Saya tidak percaya ada pendekatan satu ukuran untuk semua, dan tidak ada cukup informasi tentang situs web dan lingkungan Anda untuk menyarankan solusi yang paling cocok untuk situasi Anda. Namun, menurut saya ada beberapa pertimbangan yang dapat diingat untuk membantu memandu penerapan di sebagian besar situasi.
Mengambil seluruh situs (server web dan database) offline adalah pilihan dalam beberapa kasus. Ini tentu saja cara paling mudah untuk mengelola pembaruan. Tetapi waktu henti yang sering (bahkan ketika direncanakan) dapat menjadi cara yang baik untuk menjalankan bisnis kami dengan cepat, membuatnya melelahkan untuk menerapkan bahkan perubahan kode kecil, dan mungkin memakan waktu berjam-jam jika Anda memiliki kumpulan data yang besar dan/atau migrasi yang rumit. Karena itu, untuk situs yang saya bantu kelola (yang semuanya internal dan umumnya hanya digunakan selama jam kerja pada hari kerja), pendekatan ini sangat berhasil.
Hati-hati jika Anda melakukan perubahan pada salinan database master Anda. Masalah utama di sini adalah situs Anda masih aktif, dan mungkin menerima penulisan ke database. Apa yang terjadi pada data yang ditulis ke database master saat Anda sibuk memigrasi klon untuk digunakan nanti? Situs Anda harus tidak aktif sepanjang waktu atau berada dalam status hanya-baca untuk sementara jika tidak, Anda akan kehilangannya.
Jika perubahan Anda kompatibel ke belakang, dan Anda memiliki web farm, terkadang Anda dapat lolos dengan memperbarui server database produksi langsung (yang menurut saya tidak dapat dihindari dalam kebanyakan situasi) dan kemudian secara bertahap memperbarui node di farm dengan mengeluarkannya dari penyeimbang beban untuk waktu yang singkat. Ini dapat bekerja dengan baik - namun masalah utama di sini adalah jika node yang telah diperbarui mengirim permintaan untuk url yang tidak didukung oleh node yang lebih lama, Anda akan gagal karena Anda tidak dapat mengelolanya di tingkat penyeimbang beban.
Saya telah melihat/mendengar beberapa cara lain bekerja dengan baik.
Yang pertama adalah membungkus semua perubahan kode dalam kunci fitur yang kemudian dapat dikonfigurasi saat run-time melalui beberapa opsi konfigurasi di seluruh situs. Ini pada dasarnya berarti Anda dapat merilis kode di mana semua perubahan Anda dimatikan, dan kemudian setelah Anda membuat semua pembaruan yang diperlukan ke server Anda, Anda mengubah opsi konfigurasi Anda untuk mengaktifkan fitur tersebut. Tapi ini membuat kode yang cukup berat...
Yang kedua adalah membiarkan kode mengelola migrasi. Saya pernah mendengar tentang situs tempat perubahan kode ditulis sedemikian rupa sehingga menangani migrasi saat runtime. Itu dapat mendeteksi versi skema yang digunakan, dan format data yang didapat kembali - jika data berasal dari skema lama, ia melakukan migrasi di tempat, jika data sudah dari skema baru tidak melakukan apa-apa . Dari penggunaan situs alami, sebagian besar data Anda akan dimigrasikan oleh orang yang menggunakan situs tersebut, sisanya dapat Anda lakukan dengan skrip migrasi kapan pun Anda mau.
Tapi saya pikir pada titik ini Google menjadi teman Anda, karena seperti yang saya katakan, solusinya sangat spesifik konteks dan saya khawatir jawaban ini akan mulai menjadi tidak berarti... Cari sesuatu seperti "zero down time deployment" dan Anda' akan mendapatkan hasil seperti ini dengan banyak ide...