Rubyと仲良くなりたい٩( 'ω' )و

Rubyと仲良くなりたい日々のこと

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ではサポート出来ないため、データベースに依存する形での取り扱いとなりメンテナンスが大変になってしまうからです。

PostgreSQLMySQLを利用する場合が多いので、この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についてのオフィシャル情報を確認する
  • 利用するデータベース(のバージョンに応じた)オフィシャル情報を確認する
  • 迷ったら将来のことをよく考える