Skip to main content

データベースバージョン管理のベストプラクティス

Adela · 2025年4月6日

これはデータベースのバージョン管理と database-as-code (GitOps) を扱うシリーズ記事です。

  1. データベースバージョン管理
  2. データベースバージョン管理、State ベースか Migration ベースか?
  3. Database as Code — 良いところ、悪いところ、見たくないところ
  4. Database as Code のランドスケープ
  5. データベースバージョン管理のベストプラクティス (本記事)

データベースバージョン管理とは、データベーススキーマと関連データの変更を時系列で管理・追跡する運用です。なぜベストプラクティスが大切なのか。リスクの低減、コラボレーションの向上、データの監査可能性の担保のためです。

GitOps と組み合わせたスクリプト派でも、GUI ベースのツール派でも、肝心なのは信頼でき、再現可能で、監査可能なプロセスを確立することです。本ガイドでは両方のアプローチを念頭に、ベストプラクティスを順に紹介します。

1. State ベースより Migration ベースを選ぶ

Migration ベースか State ベースか — まず最初に決めるべき大きな選択です。

  • Migration ベース: ステップごとの変更を明示的に書く (例: add_user_table.sql)。Flyway、Liquibase などスクリプトベースのワークフローでも、Bytebase のような GUI ツールでも相性が良い。
  • State ベース: 望ましい最終状態を定義し、ツールが差分を計算する。代表例は SQL Server の DACPAC。

詳しくは データベースバージョン管理、State ベースか Migration ベースか? を参照してください。

2. すべての成果物をバージョン管理する

スクリプトベースのアプローチを採るなら、テーブル、プロシージャ、ビュー、シードデータをすべて SQL ファイルとしてバージョン管理にチェックインしましょう。権限やロール、リソースの定義も忘れずに。

GUI ベースのツールでは、データベース関連のチケットをすべてそのツールの UI または API 経由で作成する必要があります (Jira や Linear など別のチケットシステムからトリガーしても構いません)。決して直接データベースに変更を入れないでください。検知できない問題を引き起こします。

3. アトミックなコミットを徹底する

1 マイグレーション = 1 つの論理的な変更。各変更はそれぞれ専用のマイグレーションファイルやチケットで追跡しましょう (例: テーブルの追加、カラムの変更)。デバッグ、レビュー、ロールバック、監査がシンプルになります。

4. テストと検証を自動化する

GUI ベースなら、Bytebase のようなツールが設定可能な SQL レビューと、影響行数を見積もるドライランプレビューを提供します。

スクリプトベースなら、CI/CD ツール (GitHub Actions、GitLab CI など) を使って、SQL Lint、構文チェック、命名規約チェックを行うデータベーステストツールを統合できます。

5. すべての変更にドキュメントを残す

スクリプトベースでは、各ファイルの先頭にコメントを追加し、Jira/GitHub/GitLab の Issue にリンクしましょう。GUI ベースでは詳細なコメントを書きます。コンプライアンスとナレッジ共有の両面で役立ちます。

6. 承認を強制する

スクリプトベースでは、GitHub/GitLab/Azure DevOps のプルリクエストでコードレビューを強制できます。

Bytebase のような GUI ツールは、リスクに応じて自動でマッチする承認フローを提供します。操作内容、対象データベースに応じてリスクレベルをカスタマイズし、承認戦略を指定できます。

7. 明確なステージング戦略を持つ

スクリプトベースではトランクベース開発を採用し、データベース変更はフィーチャーブランチで作業して PR でマージしましょう。

GUI ベースでは、Bytebase が環境ベースのマルチステージワークフローを提供します。dev → staging → production と段階的に変更を進められます。

8. ロールバックを計画する

スクリプトベースでは、各マイグレーションに対応する xxxx_down.sql を用意するか、後方互換な SQL を維持しましょう。

Bytebase のような GUI ツールには、ワンクリックロールバックが組み込まれています。

9. 機微なデータを保護する

スクリプトベースではシークレットをハードコードせず、環境変数や HashiCorp Vault、AWS Secrets Manager などのシークレット管理ツールを使いましょう。GUI ベースでは、ツール固有のシークレット注入機能やマネージドクレデンシャルストアを活用してください。

10. すべての変更を記録・監査する

スクリプトベースでは、スキーマバージョンを確認し、失敗したマイグレーションをアラートにします。Bytebase のような GUI ツールでは、各マイグレーションごとの変更履歴と監査ログがそのまま備わっています。

まとめ

ベストプラクティススクリプトベースGUI ベース
State ベースより Migration ベースを選ぶSQL ファイルでステップごとの変更を定義する (例: Flyway、Liquibase、Bytebase)Bytebase でマイグレーションを管理する
すべての成果物をバージョン管理するデータベースオブジェクト (テーブル、プロシージャ、ビュー、権限) をすべて SQL ファイルとしてチェックインするすべての変更をツールの UI または API 経由で作成し、システムを迂回しない
アトミックなコミットを徹底する1 つの論理変更につき 1 つのマイグレーションファイル1 つの論理変更につき 1 つのチケット
テストと検証を自動化するCI/CD パイプラインで SQL Lint や構文チェックを統合するBytebase が SQL レビューとドライランを内蔵
すべての変更にドキュメントを残すマイグレーションファイルにコメントを追加し、Issue トラッカーへリンクするツールの UI 上で詳細なコメントを書く
承認を強制するGit プラットフォームのプルリクエストレビューを使うBytebase でリスクベースの承認ワークフローを設定する
明確なステージング戦略を持つフィーチャーブランチを使ったトランクベース開発環境ベースのマルチステージワークフロー (dev → staging → prod) を活用
ロールバックを計画する対応する down マイグレーションや後方互換な変更を用意するBytebase がワンクリックロールバックを内蔵
機微なデータを保護する環境変数やシークレット管理ツールを使うツール固有のシークレット注入やマネージドクレデンシャルストアを活用する
すべての変更を記録・監査するスキーマバージョンを監視し、失敗したマイグレーションをアラートにするBytebase が変更履歴と監査ログを内蔵

GitOps と組み合わせたスクリプトでマイグレーションを管理しても、UI をクリックして進めても、データベース変更管理の鍵は一貫性です。

GUI ツールはオンボーディングを早め、人為ミスを減らし、ガードレールが組み込まれていることが多いです。

スクリプトベースのワークフローは、柔軟性、透明性、Git ネイティブな操作を提供します。

ベストプラクティスは何か。チームのスキルセット、ツール、成熟度に合った道を 1 つ選ぶこと。そのうえで、すべての変更がバージョン管理され、テストされ、レビューされ、追跡可能であることを徹底しましょう。

そして忘れずに、金曜にプッシュしないこと。

ブログに戻る

データベース開発のスタンダードを体験する