cat posts/%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e8%a8%ad%e8%a8%88%e3%81%a7%e5%be%8c%e6%82%94%e3%81%97%e3%81%9f%e8%a9%b1.md

テーブル設計で後悔した話

「あとで変えられるから」と思って雑に作ったテーブルを、本番稼働後に変えようとして苦労しました。

やってしまったこと

ユーザーの属性情報を全部 users テーブルに突っ込んでいました。最初は nameemail だけだったのが、機能追加のたびにカラムが増え、気づいたら 30 カラム超えていました。

-- こうなってしまった
users
  id, name, email,
  address, phone, birthday,
  plan_type, plan_started_at, plan_expires_at,
  last_login_at, login_count,
  referral_code, referred_by,
  ... (続く)

テーブルの責務が混在して、JOIN なしでは何もできない割に JOIN しても直感的に取れない状態になりました。

学んだこと

テーブルは「名詞」で切ります。usersuser_profilessubscriptionslogin_histories のように責務を分けると、後からカラムを追加しても影響範囲が小さくなります。

設計に時間をかけることを「無駄」だと思っていましたが、本番後のマイグレーションにかかる時間と比べたら安いものでした。