Apa cara efisien untuk menangani skema database yang dibagikan di antara cabang kode?

12

Bekerja pada proyek dengan banyak cabang, di mana setiap cabang akhirnya digabungkan kembali ke cabang utama, dan pada dasarnya diisolasi untuk mengembangkan fitur baru.

Basis data, yang merupakan MS SQL Server, memiliki skema bersama, namun masing-masing cabang membuat perubahan pada skema saat proses berlangsung.

Pertanyaan utama saya adalah apa cara yang baik untuk berurusan dengan berbagi skema dari cabang utama ke cabang yang diturunkan, sehingga perubahan yang dibuat ke cabang utama mudah digabung ke cabang yang diturunkan, tanpa menginjak perubahan baru dalam turunan cabang?


sumber
2
Penggabungan harus ditangani seperti kode lainnya: Penggabungan otomatis, dengan mundurnya intervensi pengguna, dan inspeksi / pengujian hasilnya. (Saya lebih suka cara Proyek Database VS menangani skema dengan satu objek per file.). The rumit bit dilengkapi dengan bagaimana ke depan migrasi kerja database yang ada ;-)
2
Ini sangat tergantung pada bagaimana Anda membuat versi skema. Apakah Anda menyimpan skrip buat untuk objek dasar plus skrip ubah? Apakah Anda menggunakan alat perbandingan skema untuk membuat skrip alter untuk dimigrasi di antara versi? Proyek database VS2010?
Mark Storey-Smith
Diskusi yang relevan: dba.stackexchange.com/questions/2/…
Nick Chammas
1
Juga relevan: martinfowler.com/articles/…
Nick Chammas

Jawaban:

7

Saya telah berhasil menggunakan metodologi berikut, diuraikan dalam Kontrol Versi dan Database Anda :

  • mempertahankan nomor versi di metadata (saya menggunakan properti yang diperluas basis data)
  • setiap perubahan skema dikodekan sebagai skrip yang diperbarui dari versi saat ini ke versi berikutnya
  • aplikasi dikirimkan dengan semua skrip untuk ditingkatkan dari versi 0 (penerapan awal) hingga versi saat ini
  • Setiap perubahan dilakukan melalui skrip. Termasuk perubahan data 'sistem' seperti kamus dan entri tabel pencarian.
  • ketika digunakan, aplikasi memeriksa versi skema di-disk, kemudian menjalankan semua langkah pemutakhiran untuk membawa skema ke versi yang diperlukan saat ini

Saya sering mendengar pendapat 'bagaimana ini berbeda dari hanya menjaga skrip definisi objek di bawah kendali sumber?'. Perbedaannya sangat besar, karena ketika Anda menggunakan versi baru aplikasi Anda, Anda tidak akan hanya membuat database baru. Sering kali aplikasi Anda harus meningkatkan basis data yang ada, termasuk data yang ada . Ini adalah perbedaan penting, langkah-langkah peningkatan Anda perlu memastikan integritas dan konsistensi data yang ada selama peningkatan. Beberapa operasi sepele dalam kode (tambahkan kolom non-nullable dengan nilai default ke skrip definisi objek tabel, selesai), tetapi sebenarnya sangat menyakitkan pada penyebaran aktual (tabel memiliki 1,5 miliar baris, kolom tambah akan habis ruang log jika dilakukan dengan cara 'simpleton').

Bagaimana cara kerjanya dengan percabangan:

  • ketika cabang dibuat, itu mengambil versi skema saat ini, katakanlah versi 1.6
  • ketika tim mulai bekerja di cabang, itu menambahkan versi baru, 1,7, dan kemudian mulai mengkodekan langkah peningkatan dari 1,6 ke 1,7
  • langkah peningkatan akan berubah saat modifikasi dilakukan di cabang. Itu selalu menjalankan skrip yang memutakhirkan dari v 1.6 ke 1.7, tetapi apa tepatnya skrip-skrip itu lakukan, tunduk pada iterasi kode normal dan lapor-masuk di cabang
  • cabang selesai pengembangan, ia mempersiapkan integrasi terbalik (untuk digabungkan kembali ke baseline)
    • itu melakukan integrasi maju baru dari baseline ke cabang. Jika integrasi tidak membawa perubahan apa pun ke versi skema, semua hal baik, cabang dapat membalikkan integrasi apa adanya. versi 1.7 menjadi versi dasar baru.
    • hal yang menarik adalah ketika cabang lain telah membalikkan integrasi ke dalam basis untuk sementara dan sekarang versi skema dasar telah berubah menjadi, katakanlah, 1.7. Dalam hal ini cabang kami harus meningkatkan versi skema target penyebarannya menjadi 1,8 dan melakukan tinjauan terhadap langkah peningkatan yang sebelumnya dari 1,6 menjadi 1,7 untuk melihat bagaimana ia beroperasi di lingkungan baru, meningkatkan dari 1,7 menjadi 1,8. Konflik skema logis harus diselesaikan, skrip mungkin memerlukan perubahan, pengujian harus dilakukan. Setelah selesai, cabang dapat membalikkan integrasi ke basis. Versi target produk yang digunakan sekarang menjadi 1,8.
    • ketika cabang lain yang telah bercabang di skema versi 1.6 ingin melakukan integrasi balik, perlu untuk itu harus menabrak versi skema itu ke 1.9, menguji skrip upgrade dari 1.8 ke 1.9, kemudian dapat mengintegrasikan kembali ke pangkalan.

Perhatikan bahwa tidak ada alat yang terlibat, tidak ada skrip skrip ajaib, tidak ada penyihir dan tidak ada skrip klik-tombol-hasil-skrip yang terlibat. Ini adalah proses yang digerakkan oleh pengembang 100%, berdasarkan sumber (skrip). Banyak yang menemukan seluruh proses ini rumit, tetapi berhasil. Faktanya, sebagai pengguna SQL Server, Anda telah meningkatkan hasil dari proses ini dalam penggunaan harian Anda terhadap SQL Server: SQL Server itu sendiri menggunakan proses pemutakhiran basis data yang sangat mirip dan, seperti yang mungkin Anda harapkan, proses pengembangan produk membuat penggunaan ekstensif percabangan dan masalah yang Anda sebutkan adalah masalah yang sangat nyata yang harus diselesaikan.

BTW, bagaimana percabangan / integrasi sebenarnya terjadi berbeda antara produk-produk kontrol sumber, saya menggunakan istilah yang akrab dengan modus operasi mengintegrasikan perforce .

Remus Rusanu
sumber
+1, khususnya untuk Setiap perubahan dilakukan melalui skrip
a_horse_with_no_name
1

Meskipun jawaban saya mungkin tidak selebar Remus, saya menemukan ini sebagai solusi yang sangat bagus. Saya belum membuatnya dalam produksi dulu, jadi YMMV *.

Liquibase

Pada dasarnya ini adalah file XML di mana Anda membuat perubahan skema ke database Anda sebagai elemen baru di dalam file XML. Sebagai contoh:

<createTable tableName="department">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>

Ini memiliki sintaks yang sepenuhnya disempurnakan sehingga Anda dapat melakukan apa saja yang Anda inginkan ke database Anda.

Anda juga menentukan dalam instalasi Liquibase Anda database apa yang Anda inginkan untuk versi. Kemudian Anda "menjalankan" .xml dengan Java executable (file jar) yang disertakan. Ini pada dasarnya menciptakan kembali perubahan-perubahan yang ditentukan dalam XML ke database Anda.

Kicker sebenarnya adalah Anda menyimpan file XML ini di folder versi yang sama dengan kode Anda. Jadi dalam contoh saya itu adalah Git. Saya memiliki file XML ini di folder proyek saya (tingkat yang sama dengan /.git) dan kemudian setiap kali saya beralih cabang file XML akan berubah ke versi cabang dan saya akan menjalankan file .jar dan database saya sekarang akan mencerminkan cabang itu.

* Catatan: Saya belum menyelesaikan implementasi karena saya kesulitan menghubungkan Java ke SQL Server. Membutuhkan beberapa driver jdbc dan semacamnya dan saya tidak berminat. Oleh karena itu, jarak tempuh Anda dapat bervariasi.

MikeMurko
sumber
1

Di sini, di Red Gate kami segera merilis solusi versi database yang memanfaatkan SQL Compare dan SQL Source Control. Ini menggunakan pendekatan peningkatan skrip migrasi dan membasmi database dengan versi properti yang diperluas yang sesuai dengan revisi kontrol sumber.

Kami berharap untuk rilis pada pertengahan Desember. Ada kandidat rilis yang tersedia sekarang. Untuk informasi lebih lanjut, kunjungi:

http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/migration

Kami berharap dapat membangun solusi ini dalam beberapa bulan mendatang, jadi beri tahu kami pendapat Anda.

David Atkinson
sumber
0

Jika Anda dan menangani perubahan skema Anda dengan membuat skrip dan menjaga skrip-skrip itu di bawah kendali sumber, maka Anda harus dapat memperlakukan perubahan seperti yang Anda lakukan jika ada penggabungan kode lainnya. Anda dapat memilih untuk menggabungkan otomatis atau mengambil lebih banyak intervensi manual.


sumber
Tidak juga. Penggabungan manual objek dasar membuat skrip dapat dilakukan, tetapi ubah, sisipan data referensi dan skrip gerak data menjadi sangat berantakan, sangat cepat.
Mark Storey-Smith
Sepakat. Di sini, di Red Gate kami percaya bahwa skrip pembuatan akan bergabung dengan cukup baik dan bisa otomatis. Namun, skrip migrasi antar versi harus digabungkan dengan tangan untuk menghindari pemesanan dependensi yang salah dan duplikasi kode perubahan.
David Atkinson
0

Saya berada dalam situasi yang sama di mana saya bekerja di situs web langsung dan beberapa cabang pengembangan di mana saya perlu mengubah skema database.

Saya menyelesaikannya dengan menulis post-checkout dan hook post-merge yang dapat digunakan dengan baik dengan git. Saya menyimpan semua migrasi saya dalam bentuk file SQL di direktori terpisah dan mengkomitnya di samping kode PHP yang diubah. Setiap kali saya melakukan a

git checkout

atau a

git merge

git akan secara otomatis memanggil migrasi naik dan turun yang sesuai. Lihat implementasi saya di Github .

Richard Brinkman
sumber