以前LaravelというWebフレームワークを扱っていたとき、データベース関係で 「マイグレーション」 なる概念が出てきて、とりあえず入門通りにやればデータベースを扱えはするものの「マイグレーション」という言葉自体をどう解すればいいのかよく分からなかったという思い出がある。そんなことをふと思い出したので、似たような人の参考になればいいなという記録。
実際のところこの言葉はLaravel開発でなくても任意のシステム開発で出てくる。が、この記事ではいわゆるデータベースの構造のマイグレーションについて書く。
もともとの語義
辞書を引けば分かるように、migrationとはもともと 「移行」 という意味である。例えば古いPCを新しいPCに変えたり、前の住居から新しい家へ引っ越すなど、以前の何かから新しい次の何かへの移行。それだけだ。
使ってる機器やシステムを新しいものに移行する作業のことも一部の人は格好つけて「マイグレーション」とか呼ぶ。
さてしかし、こう説明されてもLaravelやRailsの入門者はピンとこないんじゃないかと思う。マイグレーションというのはなんかデータベーステーブルを新たに作る際にやらされるものであって、「移行」という概念とは今ひとつ一致しない。自分のときはこれで首を傾げた。
データベースマイグレーション
まず、なんか動いてるWebシステムがあるのを想像してほしい。別にWebシステムでなくてもいいのだが、とにかくそいつは内部でデータベースを使用している。 SQLを使って表形式でユーザデータとかそういうのを記録している。
ある日、このデータベースの形式をちょっと変えることになったとしよう。例えばユーザの名前にフリガナも記録するようになったとか、複数のテーブルで同じデータを記録する仕組みになってしまってるからまとめるだとか、そういうのだ。
このときテーブル構造が変わったからといって、当たり前だがテーブルを一度消して作り直すみたいな乱暴な真似は出来ない。データが消えてしまうからだ。
そういうことで一般にどうするかというと、
- 新しい構造のテーブルを別に作る
- 新しいテーブルにデータを移してそちらを使うようにする
- 最後に古いテーブルを削除する
といったことが行われる。こういう移行作業を「マイグレーション」と言う。データベースシステム自体を移行するわけではないが、データを失ってはならない都合上すこしテーブル構造を変えるのにも「移行」らしい作業が必要になるわけだ。
データベースのバージョン管理
データベースを扱う際の基本として、「データベース」とそれを扱う「アプリケーション」は分けて管理する。 アプリケーションのバージョンが変わったからといって以前のデータが消えるなどとなったら困るから、アプリケーションとは独立にデータベースを保持しておくものだ。
しかしそれはそれとして、アプリケーションのバージョンが上がれば扱うデータの形が変わることもあるだろう。 そこでよく行われるアプローチとして、データベースに「データ構造のバージョン情報」を記録する、ということが行われる。
そうすればこういうことが出来る。 アプリケーションはバージョンv2の構造のデータを扱いたいが、どうやらデータベースにはv1の構造でデータが記録されている。となったら、アプリケーションは移行処理をやることにしてv1の構造のデータをv2の構造に変換する。これがデータベースのバージョン管理などと呼ばれるものだ。そしてこの新しいバージョンへの変換処理(移行処理)をマイグレーションと呼んでいる。
そしてこれが上手く働くには、アプリケーションが各バージョン間のマイグレーション処理を持っている必要がある。 v1からv2への移行処理、v2からv3への移行処理...というのを最新版までそれぞれ持っていれば、どんなデータベースと接続されても問題なく動作できる。
これでそろそろ分かったかもしれないが、マイグレーションというのは「テーブルを作成する」といったことに主眼があるのではなく、「あるテーブルが無かったバージョンから有るバージョンへ移行する」といったことに主眼があるのである。 もちろんあるテーブルが有るバージョンから無いバージョンへの移行もマイグレーションだし、あるテーブルにカラムが4個あるバージョンから5個あるバージョンへの移行もマイグレーションである。
Laravelでphp artisan make:migration
などと打つときに行っているのは「マイグレーション処理(のソースコード)を新たに作る」という作業であり、実際にマイグレーションを実行するのがphp artisan migrate
といったコマンド、というわけである。
余談
おそらくかつての自分の混乱は、時間の無い状況と我流での勉強によるものが大きいのであって、適切に理解している人の教えをじっくり聞いていたら免れたものではないかと思う。 ただ、それにしてもネット上の「マイグレーション」という概念に関する解説は不親切なものが多い気がしている。
「マイグレーション」=「移行」という抽象概念の解説に終始するか、もしくは「とにかくこうすればデータベーステーブルが操作できる」という操作説明が多い。具体的に一体何を目的に何をするものであり、どうしてそれが「マイグレーション」と呼ばれているのか、という部分の初心者向けの説明を欠いているように思う。この記事が混乱している初心者の助けになれば嬉しい。