質問

ウェブの周りの読み取りに基づいて、スタックオーバーフロー、そしてほとんど これらの記事 ホラーのコーディングからリンクされたDBバージョン化について、私は8年前のPHP MySQL Webサイトのデータベースをバージョンする計画を書くことに刺しました。

Database Version Control plan
- Create a db as the "Master Database"
- Create a table db_version (id, script_name, version_number, author, comment, date_ran)   
- Create baseline script for schema+core data that creates this db from scratch, run this on Master Db
- Create a "test data" script to load any db with working data
- Modifications to the master db are ONLY to be made through the db versioning process
- Ensure everyone developing against the Master Db has a local db created by the baseline script
- Procedures for commiting and updating from the Master Db
    - Master Db Commit
        - Perform a schema diff between your local db and the master db
        - Perform a data diff on core data between your local db and master db
        - If there are changes in either or both cases, combine these changes into an update script
        - Collect the data to be added to a new row in db_version table, and add an insert for this into the script
            - new version number = latest master db version number +1
            - author
            - comment
        - The script must be named as changeScript_V.sql where V is the latest master db version +1
        - Run the script against the master db
        - If the script executed succesfully, add it to the svn repository
        - Add the new db_version record to your local db_version table      
    - Update from Master Db
        - Update your local svn checkout to have all the latest change scripts available
        - compares your local db_version table to the master db_version table to determine which change scripts to run
        - Run the required change scripts in order against your local db, which will also update your local db_version table

私の最初の質問は、これは正しいのでしょうか?
私の2番目の質問は、コミットプロセスが1日に1回以上行うことを少し複雑に思われることです。確実に自動化する方法はありますか?それとも、データベースの変更を頻繁にコミットする必要はありませんか?

役に立ちましたか?

解決

あなたの提案を見ると、それは実行可能でも実用的なもののようには見えません。私は、データベースごとに1k以上のテーブル(非常に複雑なシステム)を使用した会社で働いていましたが、すべてこのようにうまくいきました。

  • DBを担当する人(彼をDBPersonと呼びましょう)を持ってください - すべてのスクリプト/DBの変更は彼を通過する必要があります。これにより、不必要な変更が回避され、問題の「見落とし」があります(たとえば、誰かが彼のクエリのためにより良いパフォーマンスを発揮するためにインデックスを移動する場合、HIは他の人の仕事を破壊する可能性があります。 、など...)。これにより、DBは清潔で効率的になります。これが一人の男(または彼の代理)にとってはあまりにも多くの仕事であると思われたとしても、実際にはそうではありません - 通常、DBはめったに変わりません。
  • 各スクリプトは、dbpersonを通じて検証を渡す必要があります
  • スクリプトが承認されると、dbpersonは数字を割り当て、適切な番号を付けて「更新」フォルダー/svn(...)に入れます(提案したように、たとえば増分番号)。
  • 次に、継続的な統合がある場合、スクリプトがピックアップされ、DBを更新します(継続的な統合がない場合は、手動で実行します)。
  • すべてのデータをスクリプトに記載したデータベーススクリプト全体を保存しないでください。代わりに実際のデータベースを保存します。ソリューションのブランチがある場合 - 各ブランチが独自のデータベースを備えている場合、または各ブランチに対して更新スクリプトを分割して、別のブランチにロールバック/フォワードできるようにすることができます。しかし、各ブランチに個別のDBを使用することをお勧めします。
  • デフォルトのデータ(無傷)のデータベース(無傷)を使用してください。単体テスト、回帰テストなどのニーズのために、テストを行うときはいつでも、このデータベースのコピーでそれらを実行します。メインデータベースを使用してテストデータベースを毎晩クリーンアップすることもできます(もちろん、必要に応じて)。

このような環境では、データベースの複数のバージョンがあります。

  • 開発者データベース(ローカル) - 開発者が自分の作品をテストするために使用しているもの。彼はいつでもマスターまたはテストマスターからコピーできます。
  • マスターデータベース - すべてのデフォルト値を持つデータベース。新しいクライアントに再展開を行っている場合は、半透明です。
  • テストマスターデータベース - テストデータで満たされたマスターデータベース。マスターで実行したスクリプトもここで実行しました。
  • Test in Progress Database-テストマスターからコピーされ、テストに使用される - 新しいテストの前に上書きされます。
  • ブランチ(各クライアントにわずかな違いがある同様のデータベース)がある場合、各ブランチの上記と同じです...

状況に合わせてこれを変更する必要がありますが、とにかく、データベース全体の作成スクリプトのテキストバージョンを保持することは、保守性、マージ、更新などの点で間違っていると思います...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top