ざっくり migration で指定するデータ型について書いておきます。
型の種類
Rails の Migration で指定できるデータ型としては一般的に以下があります。(今回の説明のため primary_key
は除いています)
型 | 内容 |
---|---|
string | 文字列(255文字まで) |
text | 長い文字列 |
integer | 整数 |
bigint | 整数 |
float | 浮動小数 |
decimal | 精度の高い小数 |
datetime | 日時 |
timestamp | 日時(Unixtime) |
time | 時間 |
date | 日付 |
binary | バイナリデータ |
boolean | 真偽値 |
参考: ActiveRecord::ConnectionAdapters::SchemaStatements
文字列の扱い
文字列を扱う際に選択肢として、 string
と text
があります。
string
は255文字までしか取り扱えないため、255文字以上になる可能性があるのであれば、 text
を選択します。
例えばユーザー名などは string
で良いでしょうし、いわゆる備考欄のようなものを保存するなら text
でしょう。
メールアドレスは string
でOKと言われていることが多いですが、どうでしょうか?RFC5321 で reverse-path や forward-path で利用できるのが 256文字、これらには区切り文字として <
, >
が含まれるため、実際には 254文字 となります。そのため、 string
で問題ないとなります。
それ以外で256文字以上となってしまう可能性や、その際に運用フェーズで変更に対応できるかを検討した上で決めるべきでしょう。
小数の扱い
小数を使用する場合は、丸め誤差についてきちんと検討する必要があります。
float
は精度を指定できないため、丸め誤差が発生しても良い場合にしか利用できません。
decimal
では全体の桁数と小数点以下の桁数を指定できます。
t.decimal :sample, precision: 15, scale: 2
上記では、全体の桁数を15、小数点以下の桁数を2としています。これにより、誤差の問題を指定した精度のレベルでは解消することができます。
ID
整数値のIDについてはいろんなパターンがあると思いますが、増加量が止まることが想定できないことがあるのであれば、 bigint
を選択するべきでしょう。
もし、どうしてもストレージサイズを抑えたいなどがあれば integer
でも良いのですが、そうでなければ、とりあえず bigint
にしておくことで想定外の増加に対して、運用時にこまることが少なくなるでしょう。
文字列の場合は一般的に string
で十分ではないでしょうか。
パスワードの保存
データ型を考える前に、パスワードは基本的に生データとして保存することは避けましょう。
通常であれば、 has_secure_password
を利用するなどが妥当でしょう。この場合、自分で型を指定することはないでしょう。
あとは、そもそもパスワード管理をしない方法を考えるのがいいかもしれません(OpenIDの利用などです)。
まとめ
データ型を選ぶ際にはいろいろと検討する必要がありますが、以下に気をつけておくと良さそうです。
- 必要なサイズ、精度が十分なものを選択する
- セキュリティ的に問題ない形式を選択する
- 運用が始まって変更になっても問題ないか、問題があるならより変更が少ない方に倒す
- オプションなどをドキュメントで理解した上で使用する