What is it, naokirin?

Rails migrationで使うデータ型を考える

ざっくり migration で指定するデータ型について書いておきます。

型の種類

Rails の Migration で指定できるデータ型としては一般的に以下があります。(今回の説明のため primary_key は除いています)

内容
string 文字列(255文字まで)
text 長い文字列
integer 整数
bigint 整数
float 浮動小数
decimal 精度の高い小数
datetime 日時
timestamp 日時(Unixtime)
time 時間
date 日付
binary バイナリデータ
boolean 真偽値

参考: ActiveRecord::ConnectionAdapters::SchemaStatements

文字列の扱い

文字列を扱う際に選択肢として、 stringtext があります。

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の利用などです)。

まとめ

データ型を選ぶ際にはいろいろと検討する必要がありますが、以下に気をつけておくと良さそうです。

  • 必要なサイズ、精度が十分なものを選択する
  • セキュリティ的に問題ない形式を選択する
  • 運用が始まって変更になっても問題ないか、問題があるならより変更が少ない方に倒す
  • オプションなどをドキュメントで理解した上で使用する