知識マップ: 業務アプリのDBスキーマをバージョン管理する ── 「客先ごとにDBが違う」を防ぐマイグレーションの実践
記事「業務アプリのDBスキーマをバージョン管理する ── 「客先ごとにDBが違う」を防ぐマイグレーションの実践」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
客先ごとに分散する業務アプリのDBは、手作業のSQL手順書運用では適用漏れや途中失敗の放置によってスキーマがバラつきます。この記事は、DB自身にスキーマバージョン番号(SQLiteならPRAGMA user_version)を持たせ、番号付きの前進マイグレーションを起動時にトランザクション単位で自動適用する設計を軸に整理します。列の削除やリネームのような破壊的変更はexpand-contractの2段階リリースで行い、旧バージョンのアプリを締め出す判定にはスキーマ番号とは別の最低互換バージョンを使う必要があります。適用前のVACUUM INTOによる自動バックアップ、複数プロセス同時起動の直列化、最古のDBからの一気適用リハーサルまで含め、EF Core Migrations・DbUp・自前実装のどれを選ぶかの判断基準も示します。
flowchart LR
accTitle: DBスキーマのバージョン管理とマイグレーションの知識マップ
accDescr: 業務アプリのDBスキーマをPRAGMA user_versionなどのスキーマバージョンと前進マイグレーションで管理し、破壊的変更をexpand-contractの2段階リリースと最低互換バージョンによる旧アプリの締め出しで安全に進め、EF Core Migrations・DbUp・自前実装を使い分ける関係を示す図
schema_migration["前進マイグレーション"]
multi_tenant_db_drift["客先ごとのDBスキーマの分散"]
manual_sql_procedure_ops["手作業のSQL手順書運用"]
schema_version["スキーマバージョン番号"]
sqlite_user_version["PRAGMA user_version"]
schema_version_table["SQL Serverの専用バージョンテーブル"]
sqlite["SQLite"]
migration_transaction["マイグレーションのトランザクション化"]
ddl_transaction_support["DDLのトランザクション対応可否"]
pre_migration_backup["適用前バックアップ"]
vacuum_into["VACUUM INTO"]
old_app_lockout["旧バージョンアプリの締め出し"]
min_compatible_version["最低互換バージョン(min_compatible_version)"]
expand_contract["expand-contract(2段階リリース)"]
ef_core_migrations["EF Core Migrations"]
dbup["DbUp"]
migration_rehearsal["最古DBからの一気適用リハーサル"]
concurrent_migration_lock["マイグレーション適用の直列化"]
sql_server["SQL Server"]
manual_sql_procedure_ops -->|"原因になり得る"| multi_tenant_db_drift
schema_migration -->|"防止する"| multi_tenant_db_drift
schema_migration -->|"前提とする"| schema_version
schema_version -.->|"に保存される"| sqlite_user_version
schema_version -.->|"に保存される"| schema_version_table
sqlite_user_version -->|"に保存される"| sqlite
schema_migration -->|"前提とする"| migration_transaction
migration_transaction -.->|"前提とする"| ddl_transaction_support
schema_migration -.->|"前提とする"| pre_migration_backup
pre_migration_backup -.->|"利用する"| vacuum_into
vacuum_into -->|"前提とする"| sqlite
schema_version -->|"両立しない"| old_app_lockout
old_app_lockout -->|"利用する"| min_compatible_version
expand_contract -.->|"前提とする"| old_app_lockout
ef_core_migrations -.->|"推奨される対応"| schema_migration
dbup -.->|"推奨される対応"| schema_migration
ef_core_migrations -.->|"用いるのは非推奨"| sqlite
migration_rehearsal -->|"推奨される対応"| schema_migration
schema_migration -.->|"前提とする"| concurrent_migration_lock
ef_core_migrations -->|"自動化する"| concurrent_migration_lock
schema_migration -.->|"前提とする"| expand_contract
schema_version_table -->|"に保存される"| sql_server
概念間の関係(全22件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- 手作業のSQL手順書運用は客先ごとのDBスキーマの分散の原因になることがあります。
- 前進マイグレーションは客先ごとのDBスキーマの分散を防ぎます。
- 前進マイグレーションはスキーマバージョン番号を前提とします。
- スキーマバージョン番号はPRAGMA user_versionに保存されます。
- スキーマバージョン番号はSQL Serverの専用バージョンテーブルに保存されます。
- PRAGMA user_versionはSQLiteに保存されます。
- 前進マイグレーションはマイグレーションのトランザクション化を前提とします。
- マイグレーションのトランザクション化はDDLのトランザクション対応可否を前提とします。
- 前進マイグレーションは適用前バックアップを前提とします。
- 適用前バックアップはVACUUM INTOを利用します。
- VACUUM INTOはSQLiteを前提とします。
- スキーマバージョン番号は旧バージョンアプリの締め出しと両立しません。
- 旧バージョンアプリの締め出しは最低互換バージョン(min_compatible_version)を利用します。
- expand-contract(2段階リリース)は旧バージョンアプリの締め出しを前提とします。
- EF Core Migrationsは前進マイグレーションに対する本記事の推奨です。
- DbUpは前進マイグレーションに対する本記事の推奨です。
- EF Core MigrationsをSQLiteに用いることは推奨されません。
- 最古DBからの一気適用リハーサルは前進マイグレーションに対する本記事の推奨です。
- 前進マイグレーションはマイグレーション適用の直列化を前提とします。
- EF Core Migrationsはマイグレーション適用の直列化を自動化します。
- 前進マイグレーションはexpand-contract(2段階リリース)を前提とします。
- SQL Serverの専用バージョンテーブルはSQL Serverに保存されます。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。