Ruby on Rails データ型は何が適しているかを考える
はじめに
Ruby on Railsのmigrationで扱うデータ型は何が適しているか。 どうやって考えたらいいかわからない状態からの考え方をまとめました。
何をみるべきか
データ型にどんな種類があるかを考える時に、何はともあれオフィシャル情報を参照することが大切です。
私の場合、「Ruby, データ型, 一覧」などで検索してそれらしきものが見つからず「???」となっていました。
1. まずはRailsのデータ型をみる
migrationに追加できるカラムについて、Ruby on Rails のドキュメントを参照します。
ActiveRecord::ConnectionAdapters::SchemaStatements
こちらがRuby on Rails 5.2.0のmigrationsで追加可能なカラムのデータ型です。
オフィシャル情報 | 日本語でざっくり概要 |
---|---|
primary_key | プライマリキー |
string | 文字列(1〜255文字) |
text | 長い文字列(1〜4294967296文字) |
integer | 整数(4バイト) |
bigint | 整数(8バイト) |
float | 浮動小数 |
decimal | 精度の高い小数 |
numeric | 数値 |
datetime | 日時 |
time | 時間 |
date | 日付 |
binary | バイナリデータ |
boolean | Boolean型 |
2. なんのDatabaseを使っているか
アプリケーションで利用するデータベースが何かを確認します。
データベースによってサポートしている型やデータの扱い方が異なるため、利用するデータベースとそのバージョンに応じた公式情報を確認します。上記Railsのmigarationで挙げている以外のデータ型については、採用しない方が良さそうです。Railsではサポート出来ないため、データベースに依存する形での取り扱いとなりメンテナンスが大変になってしまうからです。
PostgreSQLやMySQLを利用する場合が多いので、この2つのドキュメンテーションの場所を載せておきます。
対応したバージョンのものをご参照ください。
似ているけど違うものはどうするのか
実際にどちらが良いのか迷ったものと考え方を紹介します。
文字を扱う場合、stringとtextどちらが適しているか
stringは、255文字までしか扱うことが出来ないため、状態や時期によっては、256文字以上になる可能性のあるデータを扱う場合はtextを使うことをおすすめします。
名前やメールアドレス、社名などの文字情報は、stringで取り扱い、本文や備考などの文章情報はtextを使うのが一般的です。
enumを扱う場合、stringとintegerどちらが適しているか
これ、私は本当にどっち?と思ったのですが、hashのintegerをマッピングできるのがenumなので、enumで扱う予定のカラムをstringにしたらそもそもenumを取り入れる意味がないし、機能しないですね。ということを冷静に考えて、enumで扱う予定のカラムのデータ型はintegerが適しています。
idを扱う場合、 integerとbigintどちらが適しているか
idは、将来的にユーザーが増えると膨大な桁数になる可能性があります。Rails5.1からidカラムがデフォルトでbigintになっていることも踏まえて、基本的にはbigintが適していると考えて良いでしょう。
いずれも、現状と一致させるという考え方よりは、将来的に「入らない!」という状況になる可能性が少しでもあれば大きめの箱を用意する、という考え方で選定すると安心です。
まとめ
- Railsのmigrationについてのオフィシャル情報を確認する
- 利用するデータベース(のバージョンに応じた)オフィシャル情報を確認する
- 迷ったら将来のことをよく考える