「あとで変えられるから」と思って雑に作ったテーブルを、本番稼働後に変えようとして苦労しました。
やってしまったこと
ユーザーの属性情報を全部 users テーブルに突っ込んでいました。最初は name、email だけだったのが、機能追加のたびにカラムが増え、気づいたら 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 しても直感的に取れない状態になりました。
学んだこと
テーブルは「名詞」で切ります。users、user_profiles、subscriptions、login_histories のように責務を分けると、後からカラムを追加しても影響範囲が小さくなります。
設計に時間をかけることを「無駄」だと思っていましたが、本番後のマイグレーションにかかる時間と比べたら安いものでした。