Bagaimana Anda menangani dimensi basis data yang terus berubah?

9

Selama dua bulan terakhir ini saya telah mencari solusi atau praktik untuk menangani manajemen rilis dalam basis data. Saya mencari apa yang orang lihat sebagai proses terbaik untuk menangani ini.

Kami memiliki 3 lingkungan untuk basis data kami:

  • Pengembangan
  • Pengujian Penerimaan Pengguna (UAT)
  • Produksi

Masalahnya adalah kadang-kadang kita membuat perubahan pada beberapa hal dalam basis data pengembangan kami dan tiba waktunya untuk digunakan, beberapa fitur mungkin tidak siap untuk dirilis ke UAT.

Baru-baru ini kami telah mulai menggunakan kontrol Red Gate SQL Source untuk menyimpan semua entitas kami (dengan komit reguler).

Saya sedang berpikir untuk pergi dari perubahan (yaitu mengatakan semuanya dari changeset X dan kembali sekarang sedang didorong ke UAT) Namun, ini berarti bahwa orang hanya memeriksa kode mereka ke dalam kontrol sumber sebelum kita melakukan penyebaran yang bisa membingungkan ( terutama karena orang-orang pelupa). Masalah lain dengan pergi dengan pendekatan changeset adalah jika ada bug dalam prosedur tersimpan yang perlu diperbaiki, nomor changeset akhirnya akan keluar dari ruang lingkup max changeset kami untuk revisi sehingga membuatnya sehingga jika kita perlu buat ulang database dari perubahan maksimum, kami akan mendorong bug keluar lagi.

Ada saran tentang suatu proses?

Terima kasih

judda
sumber
Kedengarannya seperti skrip database Anda tidak dalam kontrol sumber yang sama dengan kode "aktual" Anda. Kenapa ini? Bisakah Anda memperlakukannya sebagai "kode sumber" dan menaruhnya dengan cabang individu?
Mike M.
Saat ini kami hanya menyimpan versi pengembangan skrip dalam kontrol sumber dan UAT / Produksi keduanya tidak selaras dengan pengembangan aktif. Setiap skrip dalam kontrol sumber diperbarui setiap kali pengembang melakukan komit. Masalah dengan masing-masing cabang adalah kami memiliki 1 basis data terpusat yang digunakan semua orang (untuk perubahan yang lebih besar kami membuka basis data terpisah).
1
Anda bisa membuat cabang untuk rilis, dan hanya melakukan perubahan pada hal ini yang berkaitan dengan rilis. Semua perubahan lain harus dilakukan ke bagasi. Anda akan membutuhkan dua database pengembangan untuk mencapai ini. Apakah ini akan menjadi masalah?
Kedengarannya seperti salah satu kemungkinan jatuh tempo cukup cepat. Tidak? Untuk salah satu proyek saya, kami berada di tengah-tengah perbaikan besar-besaran database, jadi kami melakukan cabang yang satu sehingga pengembangan aktif masih dapat terjadi dalam versi database yang tidak dimodifikasi. Namun, setiap hari saya melihat versi bercabang kami semakin ketinggalan zaman yang saya tidak yakin apakah itu ok atau tidak ... Saya tidak pernah benar-benar harus menghadapi situasi seperti ini sebelumnya.
judda

Jawaban:

5

Migrasi

Atas dan ke bawah, yang ada di repo Anda dan ditandai bersama dengan aplikasi Anda.

Anda bahkan dapat DIY dengan flatfiles sql yang memodifikasi skema Anda dan memperbarui versi skema. Yang harus Anda lakukan adalah:

  • menjaga migrasi Anda di sebelah kode sumber, mereka harus diversi dan ditandai bersama
  • selalu gunakan perubahan terkelola (migrasi) di semua lingkungan
  • jangan pernah mengizinkan modifikasi ad-hoc di lingkungan apa pun

Baik Anda dapat melakukan perubahan pengembangan di dev, tetapi Anda harus selalu menerbangkan Anda db dan membangunnya kembali dengan migrasi setelah Anda menangkap perubahan.

dietbuddha
sumber
Apa yang akan terjadi jika bug ditemukan dalam skrip? Apakah Anda kembali ke skrip sql dan memperbaruinya?
judda
1
Tidak, Anda membuat migrasi baru (yang meningkatkan versi skema). Begitulah cara Anda mengetahui perbaikan telah dikerahkan, dengan melihat versi skema di database.
dietbuddha
Terima kasih untuk bantuannya. Dari pandangan pertama ini tampaknya merupakan pendekatan yang sangat solid dan mirip dengan strategi percabangan kami.
judda
2

Kontrol sumber!

Anda tidak menyebarkan binari pengembangan Anda secara langsung ke produksi tanpa melalui svn / git / p4, Jadi mengapa basis data Anda sendiri yang melakukan itu? Dapatkan contoh pribadi untuk pengembang untuk menguji perubahan lokal mereka, tetapi ketika harus pergi ke pengembangan db, itu harus melalui diperiksa di file ddl. Anda bahkan dapat menulis alat untuk menerapkan perubahan ddl ini secara otomatis (saya tidak tahu cara yang ada untuk melakukan ini dengan benar).

Setelah Anda memiliki batasan di sekitar perubahan skema db (Tidak ada lagi sqlplus -> masalah ddl!) Dan memiliki kontrol akun yang ketat (tidak ada akses ddl ke semua orang), ini harus menjadi lebih mudah dikelola.

Subu Sankara Subramanian
sumber
1
Sayangnya basis data kami terlalu besar untuk dilewati antara pengembang untuk menjalankan sesi pribadi. Selain itu sepertinya tidak terlalu condong ke arah pengembangan berbasis tim karena pada saat ini, saya melakukan back end development sambil berbicara dengan orang-orang untuk pekerjaan UI yang menghubungkan keduanya. Saya harus mulai dengan memeriksa semua perubahan dan kemudian mendapatkan mereka untuk mendapatkan terbaru pada database yang tampaknya menjadi masalah yang cukup besar.
judda
Mengapa db pengembangan Anda harus memiliki ukuran yang sama dengan db produksi? Mereka dapat memiliki skema yang sama, dan Anda bahkan dapat memiliki armada pengujian beban khusus dengan semua data, tetapi database dev lokal mungkin kecil. Ini juga mencegah masalah kebocoran data, dll. - secara teori, data prod seharusnya tidak mengenai pengembangan sama sekali.
Subu Sankara Subramanian
Semua data kami dimuat melalui proses pemuatan data kami yang memproses file yang diberikan kepada kami dari klien dan kemudian mengubahnya menjadi data yang kami butuhkan. Jadi tidak mungkin bagi kami untuk memisahkan data dev dan prod mengingat semua beban data perlu diverifikasi dalam pengembangan. Saya kira ukurannya tidak harus sama, tetapi perlu jumlah data yang sebanding agar laporan yang kami buat dapat menghasilkan informasi yang bermakna.
judda
Seluruh DB tidak perlu direplikasi. Di Oracle, setiap pengguna memiliki skema sendiri dan kami memiliki satu skema aplikasi. Buat sinonim publik untuk semua objek dalam skema aplikasi. Kemudian setiap pengguna dapat mengubah objek (tabel, SP) dalam skema mereka sendiri dan jika mereka terhubung sebagai diri mereka sendiri, nama objek mereka akan digunakan. Untuk objek yang tidak ada skema ada sinonim yang akan digunakan. Inilah cara kami bekerja.
softveda
0

Menindaklanjuti dengan saran untuk menggunakan migrasi ... mungkin menggunakan O / RM yang mendukung Migrasi seperti Ruby on Rails dan Entity Framework 4.3 Namun masalah dengan kedua pendekatan adalah bahwa migrasi adalah semua atau tidak sama sekali. Anda tidak dapat (biasanya) memilih Migrasi mana yang diterapkan seperti yang Anda bisa dalam hal set perubahan.

Opsi lain yang layak (jika Anda berada di tumpukan microsoft, Anda tidak pernah menyebutkan platform) adalah mengelola SQL Anda dengan alat Basis Data Visual Studio. Itu telah dibangun di refactoring (mengganti nama / menghapus kolom, dll) dan melakukan verifikasi model. Jika misalnya, proc yang tersimpan mereferensikan sebuah kolom yang tidak lagi ada, itu akan memberi tahu Anda.

Michael Brown
sumber