@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/db-schema-migration-versioning-business-apps/#article>
    schema:about <https://comcomponent.com/knowledge/schema-migration/>, <https://comcomponent.com/knowledge/multi-tenant-db-drift/> ;
    schema:mentions <https://comcomponent.com/knowledge/schema-version/>, <https://comcomponent.com/knowledge/sqlite-user-version/>, <https://comcomponent.com/knowledge/schema-version-table/>, <https://comcomponent.com/knowledge/min-compatible-version/>, <https://comcomponent.com/knowledge/expand-contract/>, <https://comcomponent.com/knowledge/ef-core-migrations/>, <https://comcomponent.com/knowledge/dbup/>, <https://comcomponent.com/knowledge/vacuum-into/>, <https://comcomponent.com/knowledge/pre-migration-backup/>, <https://comcomponent.com/knowledge/migration-transaction/>, <https://comcomponent.com/knowledge/concurrent-migration-lock/>, <https://comcomponent.com/knowledge/old-app-lockout/>, <https://comcomponent.com/knowledge/sqlite/>, <https://comcomponent.com/knowledge/sql-server/>, <https://comcomponent.com/knowledge/ddl-transaction-support/>, <https://comcomponent.com/knowledge/migration-rehearsal/>, <https://comcomponent.com/knowledge/manual-sql-procedure-ops/> .

<https://comcomponent.com/knowledge/schema-migration/> a skos:Concept ;
    skos:prefLabel "前進マイグレーション"@ja ;
    skos:definition "スキーマ変更のコードを番号付きでアプリ本体に同梱し、起動時に未適用分だけを順にトランザクションで適用する仕組み。"@ja ;
    skos:altLabel "番号付きマイグレーション"@ja ;
    skos:altLabel "スキーマの前進マイグレーション"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/multi-tenant-db-drift/> ;
    ks:requires <https://comcomponent.com/knowledge/schema-version/> ;
    ks:requires <https://comcomponent.com/knowledge/migration-transaction/> .

<https://comcomponent.com/knowledge/multi-tenant-db-drift/> a skos:Concept ;
    skos:prefLabel "客先ごとのDBスキーマの分散"@ja ;
    skos:definition "客先・拠点のPCに分散した同一アプリのDBが、適用漏れや途中失敗の放置でそれぞれ異なるスキーマ状態になっていく状態。"@ja ;
    skos:altLabel "客先ごとにDBが違う問題"@ja .

<https://comcomponent.com/knowledge/manual-sql-procedure-ops/> a skos:Concept ;
    skos:prefLabel "手作業のSQL手順書運用"@ja ;
    skos:definition "スキーマ変更のSQLを手順書として作業者に流させる運用形態。実行したかどうかの記録がDBのどこにも残らない。"@ja ;
    skos:altLabel "人がSQL手順書を実行する運用"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/multi-tenant-db-drift/> .

<https://comcomponent.com/knowledge/schema-version/> a skos:Concept ;
    skos:prefLabel "スキーマバージョン番号"@ja ;
    skos:definition "アプリの製品バージョンとは別に、DB自身が持つスキーマの版を示す整数。"@ja ;
    skos:altLabel "DBのスキーマ番号"@ja ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/old-app-lockout/> .

<https://comcomponent.com/knowledge/sqlite-user-version/> a skos:Concept ;
    skos:prefLabel "PRAGMA user_version"@ja ;
    skos:definition "SQLiteのデータベースヘッダー(オフセット60)に格納される整数で、アプリケーションが自由に使ってよくSQLite自身は利用しない領域。スキーマバージョンの置き場所として使われる。"@ja ;
    skos:altLabel "user_version" ;
    ks:storedIn <https://comcomponent.com/knowledge/sqlite/> .

<https://comcomponent.com/knowledge/schema-version-table/> a skos:Concept ;
    skos:prefLabel "SQL Serverの専用バージョンテーブル"@ja ;
    skos:definition "user_versionに相当する仕組みを持たないSQL Serverで、バージョン番号・適用日時・適用時のアプリバージョンを1行ずつ記録する専用テーブル。"@ja ;
    skos:altLabel "schema_versionテーブル"@ja ;
    ks:storedIn <https://comcomponent.com/knowledge/sql-server/> .

<https://comcomponent.com/knowledge/sqlite/> a skos:Concept ;
    skos:prefLabel "SQLite"@ja ;
    skos:definition "デスクトップ業務アプリでよく使われる組み込み型のリレーショナルデータベースエンジン。"@ja .

<https://comcomponent.com/knowledge/migration-transaction/> a skos:Concept ;
    skos:prefLabel "マイグレーションのトランザクション化"@ja ;
    skos:definition "1つのマイグレーションとバージョン番号の更新を同一トランザクションに含め、失敗時に開始前の状態へ巻き戻せるようにする原則。"@ja ;
    skos:altLabel "1マイグレーション=1トランザクション"@ja .

<https://comcomponent.com/knowledge/ddl-transaction-support/> a skos:Concept ;
    skos:prefLabel "DDLのトランザクション対応可否"@ja ;
    skos:definition "CREATE TABLEやALTER TABLEなどのDDLをトランザクション内で実行し失敗時に巻き戻せるかどうかという、DBMSによって異なる性質。"@ja ;
    skos:altLabel "DDLのトランザクション参加可否"@ja .

<https://comcomponent.com/knowledge/pre-migration-backup/> a skos:Concept ;
    skos:prefLabel "適用前バックアップ"@ja ;
    skos:definition "マイグレーション適用の直前に取る、失敗時にファイル差し替えで復旧できるようにするための自動バックアップ。"@ja ;
    skos:altLabel "マイグレーション前の自動バックアップ"@ja .

<https://comcomponent.com/knowledge/vacuum-into/> a skos:Concept ;
    skos:prefLabel "VACUUM INTO"@ja ;
    skos:definition "元のファイルを変更せず、断片化を解消した一貫性のある最小サイズのコピーを別ファイルへ作成できるSQLiteのSQL文。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/sqlite/> .

<https://comcomponent.com/knowledge/old-app-lockout/> a skos:Concept ;
    skos:prefLabel "旧バージョンアプリの締め出し"@ja ;
    skos:definition "旧バージョンのアプリが新しいDBを開いてしまう事故を防ぐため、最低互換バージョンを使って古いアプリの起動を止める仕組み。"@ja ;
    skos:altLabel "最低バージョンチェック"@ja ;
    ks:uses <https://comcomponent.com/knowledge/min-compatible-version/> .

<https://comcomponent.com/knowledge/min-compatible-version/> a skos:Concept ;
    skos:prefLabel "最低互換バージョン(min_compatible_version)"@ja ;
    skos:definition "「このDBを開いてよいアプリの下限」を表す値。スキーマバージョンとは別に持ち、contractのマイグレーションのときにだけ引き上げる。"@ja ;
    skos:altLabel "締め出しの下限"@ja .

<https://comcomponent.com/knowledge/expand-contract/> a skos:Concept ;
    skos:prefLabel "expand-contract(2段階リリース)"@ja ;
    skos:definition "既存の構造を残したまま新しい構造を追加し(expand)、アプリ側の移行が済んでから旧構造を削る(contract)、破壊的変更のための2段階リリース手法。"@ja ;
    skos:altLabel "拡張-縮小の2段階リリース"@ja .

<https://comcomponent.com/knowledge/ef-core-migrations/> a skos:Concept ;
    skos:prefLabel "EF Core Migrations"@ja ;
    skos:definition "C#で書いたモデルの変更を検出して、スキーマ変更のコードを自動生成するEF Coreの付属機能。"@ja ;
    skos:altLabel "Entity Framework Core Migrations" ;
    ks:automates <https://comcomponent.com/knowledge/concurrent-migration-lock/> .

<https://comcomponent.com/knowledge/dbup/> a skos:Concept ;
    skos:prefLabel "DbUp"@ja ;
    skos:definition "SQLスクリプトの適用管理に特化したオープンソースの.NETライブラリ。実行済みスクリプトをジャーナルテーブルに記録し、未実行分だけを実行する。"@ja .

<https://comcomponent.com/knowledge/migration-rehearsal/> a skos:Concept ;
    skos:prefLabel "最古DBからの一気適用リハーサル"@ja ;
    skos:definition "各スキーマバージョンのDBファイルをテストフィクスチャとして保存し、それぞれから最新まで一気に適用するテストを自動化する取り組み。"@ja ;
    skos:altLabel "飛ばしアップデートのリハーサル"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/schema-migration/> .

<https://comcomponent.com/knowledge/concurrent-migration-lock/> a skos:Concept ;
    skos:prefLabel "マイグレーション適用の直列化"@ja ;
    skos:definition "共有DBや同一PCの多重起動で複数プロセスが同時にマイグレーションを走らせないよう、ロックやMutexで適用を直列化する仕組み。"@ja ;
    skos:altLabel "同時起動時のロック"@ja .

<https://comcomponent.com/knowledge/sql-server/> a skos:Concept ;
    skos:prefLabel "SQL Server"@ja ;
    skos:definition "クライアント/サーバー型のリレーショナルデータベース管理システム。一部のDDLはトランザクション内で実行できない。"@ja ;
    skos:altLabel "Microsoft SQL Server" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/manual-sql-procedure-ops/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/multi-tenant-db-drift/> ;
    schema:description "手順書のSQLを人が実行する運用は、適用漏れ・途中失敗の放置・バージョン飛ばし・現地パッチの蓄積によって客先ごとにDBスキーマが異なる状態を引き起こすことがある"@ja ;
    ks:evidence <https://learn.microsoft.com/ef/core/managing-schemas/migrations/applying> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/schema-migration/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/multi-tenant-db-drift/> ;
    schema:description "DB自身が現在バージョンを検査し起動時に未適用分を自動適用する前進マイグレーションは、客先ごとにDBスキーマが異なる状態を構造的に防ぐ"@ja ;
    ks:evidence <https://learn.microsoft.com/ef/core/managing-schemas/migrations/applying> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/schema-migration/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/schema-version/> ;
    schema:description "前進マイグレーションは、現在バージョンより大きい番号だけを適用するために、DB自身が持つスキーマバージョン番号を前提とする"@ja ;
    ks:evidence <https://www.sqlite.org/pragma.html#pragma_user_version> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/schema-version/> ;
    rdf:predicate ks:storedIn ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-user-version/> ;
    schema:description "SQLiteではスキーマバージョン番号をPRAGMA user_versionに保存する"@ja ;
    ks:evidence <https://www.sqlite.org/pragma.html#pragma_user_version> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/schema-version/> ;
    rdf:predicate ks:storedIn ;
    rdf:object <https://comcomponent.com/knowledge/schema-version-table/> ;
    schema:description "SQL Serverではuser_versionに相当する仕組みがないため、専用テーブルにバージョン番号・適用日時を1行ずつ記録する"@ja ;
    ks:evidence <https://learn.microsoft.com/sql/t-sql/statements/create-table-transact-sql> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-user-version/> ;
    rdf:predicate ks:storedIn ;
    rdf:object <https://comcomponent.com/knowledge/sqlite/> ;
    schema:description "user_versionはSQLiteのデータベースヘッダー(オフセット60)に格納される整数で、アプリケーションが自由に使ってよい領域である"@ja ;
    ks:evidence <https://www.sqlite.org/pragma.html#pragma_user_version> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/schema-migration/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/migration-transaction/> ;
    schema:description "前進マイグレーションは、スキーマ変更とバージョン番号更新を同一トランザクションに含めることを原則とする"@ja ;
    ks:evidence <https://www.sqlite.org/lang_altertable.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/migration-transaction/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ddl-transaction-support/> ;
    schema:description "マイグレーションをトランザクションで包んで巻き戻せることは、使用するDBMSがDDLのトランザクション実行に対応していることを前提とする"@ja ;
    ks:evidence <https://www.sqlite.org/lang_altertable.html>, <https://learn.microsoft.com/sql/t-sql/statements/alter-database-transact-sql> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/schema-migration/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/pre-migration-backup/> ;
    schema:description "他人のPCにある本番データへの変更であるマイグレーションでは、失敗時にファイル差し替えで復旧できるよう、適用前の自動バックアップを用意しておくことが強く推奨される。バックアップ自体はマイグレーションの実行に技術的に必須ではないが、無いと復旧手段を失う"@ja ;
    ks:evidence <https://www.sqlite.org/lang_vacuum.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/pre-migration-backup/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/vacuum-into/> ;
    schema:description "SQLiteでの適用前バックアップは、稼働中のDBから一貫したスナップショットを1文で作れるVACUUM INTOを利用する"@ja ;
    ks:evidence <https://www.sqlite.org/lang_vacuum.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/vacuum-into/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/sqlite/> ;
    schema:description "VACUUM INTOはSQLite固有の文であり、出力先ファイルが事前に存在しないか空であることを要求する"@ja ;
    ks:evidence <https://www.sqlite.org/lang_vacuum.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/schema-version/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/old-app-lockout/> ;
    schema:description "旧アプリの締め出し判定にスキーマバージョン番号(user_version)そのものを使うと、expand適用直後にuser_versionが上がり共存期間が成立しなくなるため両立しない"@ja ;
    ks:evidence <https://www.sqlite.org/pragma.html#pragma_user_version> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/old-app-lockout/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/min-compatible-version/> ;
    schema:description "旧アプリの締め出しは、スキーマバージョンとは別に持つ最低互換バージョンだけで判定する"@ja ;
    ks:evidence <https://www.sqlite.org/pragma.html#pragma_user_version> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/expand-contract/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/old-app-lockout/> ;
    schema:description "共有DBを旧バージョンのアプリが参照しうる場合、expand-contractのcontract(縮める)リリースは、最低バージョンチェックで旧アプリを締め出せる状態になってから出すのが安全とされる"@ja ;
    ks:evidence <https://www.sqlite.org/lang_altertable.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ef-core-migrations/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/schema-migration/> ;
    schema:description "すでにEF Coreでデータアクセスしている場合、モデルとスキーマの二重管理を避けられるためEF Core Migrationsが推奨される"@ja ;
    ks:evidence <https://learn.microsoft.com/ef/core/managing-schemas/migrations/applying> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dbup/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/schema-migration/> ;
    schema:description "生SQL中心でSQL Serverを使い、手順書SQLの蓄積が多い場合、実行済みスクリプトを記録して未実行分のみを実行するDbUpが推奨される"@ja ;
    ks:evidence <https://dbup.readthedocs.io/en/latest/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ef-core-migrations/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/sqlite/> ;
    schema:description "SQLiteプロバイダーでは列の型変更・削除の多くがテーブル再構築として実行され冪等スクリプトも生成できないため、EF Core Migrationsの相性は限定的とされる"@ja ;
    ks:evidence <https://learn.microsoft.com/ef/core/providers/sqlite/limitations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/migration-rehearsal/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/schema-migration/> ;
    schema:description "各スキーマバージョンのDBファイルから最新まで一気に適用するリハーサルを自動化することが、マイグレーションのリリース前に推奨される"@ja ;
    ks:evidence <https://www.sqlite.org/lang_altertable.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/schema-migration/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/concurrent-migration-lock/> ;
    schema:description "共有DBや同一PCの多重起動がある場合、前進マイグレーションは複数プロセスが同時に適用しないよう直列化する仕組みを前提とする"@ja ;
    ks:evidence <https://learn.microsoft.com/ef/core/managing-schemas/migrations/applying> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ef-core-migrations/> ;
    rdf:predicate ks:automates ;
    rdf:object <https://comcomponent.com/knowledge/concurrent-migration-lock/> ;
    schema:description "EF Core 9以降のMigrate()は、データベース全体のロックを自動取得して複数プロセスの同時適用を自動的に防ぐ"@ja ;
    ks:evidence <https://learn.microsoft.com/ef/core/managing-schemas/migrations/applying> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/schema-migration/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/expand-contract/> ;
    schema:description "列の削除やリネームのような破壊的変更を含むマイグレーションは、expand-contractの2段階リリースで行うことを前提とする"@ja ;
    ks:evidence <https://www.sqlite.org/lang_altertable.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/schema-version-table/> ;
    rdf:predicate ks:storedIn ;
    rdf:object <https://comcomponent.com/knowledge/sql-server/> ;
    schema:description "user_versionに相当する仕組みを持たないSQL Serverでは、バージョン管理用の専用テーブルをSQL Server上のデータベース内に作成する"@ja ;
    ks:evidence <https://learn.microsoft.com/sql/t-sql/statements/create-table-transact-sql> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
