DesignAssembler

備忘録に近い

スキーマについて

スキーマとは

データベースにおいてデータ型やデータ構造を示したものです。

railsでの使われ方

Rails(ActiveRecord)では、マイグレーションによってスキーマが作成されます。スキーマがあることによりデータベースに依存せず一貫したテーブルを構築することができます。

マイグレートしてdb/schema.rbが生成されてそれに従ってdbが構築されるという流れです。

Railsドキュメントには以下のように書かれています

  1. rake db:migrateを実行
  2. schema_migrationsテーブルを調べ、存在しなければ作成
  3. db/migrateディレクトリ内のすべてのマイグレーションファイルを調べる
  4. データベースの現在のバージョンと異なるバージョンがあった場合、データベースに適応
  5. schema_migrationsテーブルの更新

schema_migrationsテーブルには、どのマイグレーションファイルが実行済みかがvarchar(255)型として格納されています。

実際にmysqlにログインして確認すると以下のようになっていました。

mysql> select * from schema_migrations;
+----------------+
|   version      |
+----------------+
| 20160128035816 |
+----------------+
1 rows in set (0.00 sec)

mysql> describe schema_migrations;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| version | varchar(255) | NO   | PRI | NULL    |       |
+---------+--------------+------+-----+---------+-------+
1 row in set (0.00 sec)

コミットするか問題

Gemfile.lockと共にdb/schema.rbはコミットすべきかしないべきかの議論があります。

よくコンフリクトするファイルだし、db/migration/*.rbがあればいらないし・・・と言われています。

ですが自動生成されたdb/schema.rbには"It's strongly recommended that you check this file into your version control system."と書かれています。「バージョン管理に含めることを強くお勧めする」だそうです。

Gemfile.lockと同じように複数人で作業するときはコミットした方がいいみたいです。

techracho.bpsinc.jp

参考

DBマイグレーション | Rails日本語ドキュメント | Ruby STUDIO

qiita.com