データベースのバージョン管理を処理する適切な方法は、追加のみのバージョン スクリプトを使用することです。この性質により、各ブランチが同じファイルに追加されるため、常に競合します。あなたはあれが欲しい。これにより、開発者は、互いの変更がデータの永続性にどのように影響するかを認識できます。ただし、Rerere を使用すると、競合を 1 回だけ解決することができます。(rerere 共有に関する私のブログ投稿を参照してください: http://dymitruk.com/blog/2012/02/05/branch-per-feature/ )
バージョン番号をチェックし、スキーマを変更するか、ルックアップ データなどを変更してから、バージョン番号をインクリメントする if then 句内に各変更をラップし続けます。変更ごとにこれを続けるだけです。
疑似コードの例を次に示します。
if version table doesn't exist
create version table with 1 column called "version"
insert the a row with the value 0 for version
end if
-- now someone adds a feature that adds a members table
if version in version table is 0
create table members with columns id, userid, passwordhash, salt
with non-clustered index on the userid and pk on id
update version to 1
end if
-- now some one adds a customers table
if version in version table is 1
create table customers with columns id, fullname, address, phone
with non-clustered index on fullname and phone and pk on id
update version to 2
end if
-- and so on
これの利点は、静的言語を使用している場合、テスト プロジェクトのビルドが成功した後にこのスクリプトを自動的に実行できることです。これにより、常に最新の状態にロールアップされます。最新バージョンに更新したばかりであれば、すべての受け入れテストに合格するはずです。
問題は、2 つの異なるブランチで同時に作業するにはどうすればよいかということです。私が過去に行ったことは、データベース名がブランチ名で区切られた新しいインスタンスをスピンアップしただけです。構成ファイルが消去され (git smudge/clean を参照)、接続文字列がそのブランチの新規または既存のインスタンスを指すように設定されます。
ORM を使用している場合は、このスクリプト生成を自動化できます。たとえば、nhibernate を使用すると、db スキーマにまだ反映されていないグラフの変更を SQL スクリプトとしてエクスポートできます。したがって、customer クラスのマッピングを追加すると、NHibernate でテーブル作成スクリプトを生成できるようになります。if-then ラッパーの追加をスクリプト化するだけで、フィーチャー ブランチで自動化されます。
統合ブランチとリリース候補ブランチにはいくつかの特別な要件があり、これらのブランチをリセットする場合はデータベースを消去して再作成する必要があります。git branch --contains
新しいリビジョンが古いリビジョンであることを確認することで、フックで簡単に実行できます。そうでない場合は、ワイプして再生します。
それが明確であることを願っています。これは過去にうまく機能しており、各開発者が自分のマシン上でデータベースの独自のインスタンスを作成および破棄できる必要があります。