Manual:Schema changes/ja

このページは開発作業の一部としてデータベースのレイアウトを変更する必要がある人々のために、MediaWiki コアとその拡張機能のためのスキーマ変更パッチを構築する方法を説明するヘルプ ページです.

用語集

 * スキーマ - MediaWiki の現在のデータベース レイアウト.
 * スキーマの変更 - スキーマ移行のアトミックな部分で、コミットによって追加されるもの. 例えば、「テーブル foo を追加」、「テーブル baz からカラム bar を削除」などです.
 * データベース管理システム (DBMS) - MediaWiki のデータベースを扱う基盤技術. MediaWiki コアでサポートされているものは以下の通りです: MySQL、SQLite、PostgreSQL.  拡張機能を使用するとより多くなる可能性があります.
 * データ定義言語 (DDL) - スキーマやスキーマ変更を定義する構文 (DBMS によって異なる場合がある). 例: 「ALTER TABLE」「DROP COLUMN」.  「.sql」ファイルとして保存されます.
 * データベース抽象レイヤー (DBAL) - DBMS に依存しないデータベース スキーマおよびスキーマ変更定義と実際の DDL との間の橋渡し.

概要
各スキーマの変更では、2 つの部分を処理する必要があります. 第一に、新しいインストレーションは古いスキーマではなく新しいスキーマを持つ必要があり、第二に、古いインストレーションは新しいスキーマにアップグレードできる必要があります. 最初のパートでは、スキーマ DDL ファイル (tables.sql という名前で保存) を修正し、2 番目のパートでは、「ALTER TABLE」パッチを提供し、それをアップデーターのロジックに配線します.

DBMS ごとに 1 つずつある専用 DDL を、1 つの抽象化されたスキーマに移行している真っ最中です. テーブルによっては、複数の生の SQL ファイルを変更したり、1 つの json ファイルのみを変更し、メンテナンス スクリプトを使用して SQL ファイルを生成することがあります.

手動
2020年まで使用されるこの方式では、スキーマを変更する際に:


 * 1) 2 か所にある tables.sql を変更 (MySQL は maintenance/tables.sql、PostgreSQL は maintenance/postgres/tables.sql)
 * 2) MySQL の現行インストレーションのアップグレード パスとして、スキーマ変更 DDL ファイルを作成し、maintenance/archives/ に配置します
 * 3) * 他の種類の DBMS でそのパッチが動作しない場合は、専用のパッチを作成する必要があります. 例えば、SQLite には ALTER TABLE がありません. つまり、一時テーブルを作成してデータをコピーし、古いテーブルを削除して、新しいテーブルの名前を古い名前に変更する必要があるのです.  例
 * 4) これらの DDL ファイル (ステップ 2 より) を配線します: MysqlUpdater, SqliteUpdater, PostgresUpdater

例

 * カラムの削除 - Note that we used to support five DBMSes instead of three)
 * インデックスの変更
 * テーブルの新規作成

自動的な生成
改善に努めているところです. まずはスキーマの見直しからです. 抽象スキーマは「maintenance/tables.json」に記載されています. このファイルにはまだすべてのテーブルが含まれていないため、抽象化されていないテーブルについては、古い方法に従う必要があります. この抽象化では、Doctrine DBAL ライブラリを使用して DDL ファイルを生成しています.

If the table exists in "tables.json":


 * 1) Change the tables.json structure.
 * 2) Run maintenance script to generate the three DDL files:
 * 3) Create an abstract schema change .json file (see below) and put it in maintenance/abstractSchemaChanges/ directory
 * 4) Build the schema patches using the maintenance script, for example:
 * 5) Add them to MysqlUpdater, SqliteUpdater, PostgresUpdater
 * 6) Do not forget to checkout your changes and automatically generated DDL files in git when making the patch.

パッチの例

 * Renaming four indexes in logging table

注記

 * The default in Doctrine DBAL is "notnull": true. If you want your column to be nullable, make it explicit by "notnull": false.
 * List of column types of Doctrine DBAL can be found in: https://github.com/doctrine/dbal/blob/2.12.x/lib/Doctrine/DBAL/Types/Types.php

抽象スキーマの変更
For making a schema change, you will make a json file with snapshot of before and after abstract schemas for the table (one schema change per table please). Then you will run a maintenance script in a similar manner and it will diff between two tables and then automatically generates the schema change DDL files.

抽象スキーマの変更の例
The two tables are the same but type of "actor_user" has changed from "integer" to "bigint". The reason for diffing instead of abstracting the change itself is that SQlite does not have ALTER TABLE for most cases, meaning DBAL needs to know the schema to build a schema change DDL file using temporary tables.