Open2

DB設計

engineer rebornengineer reborn

テーブル設計

  • 単一
  • 1対1
    • 外部キー + uniq 制約
  • 1対多
    • 起点のテーブルを1にするときは、多のレコード分増える
    • 起点テーブルが「多」の場合は、レコード数は増えない
    • ex)
      • ユーザー ・権限テーブル
  • 多対多
    • ユーザー・グループ
    • ユーザーグループ(中間テーブル)
      • ユーザー1で、中間テーブルは複数紐づく
      • 中間テーブルからもう一つのテーブルは 起点テーブルが多になるので、レコード数これ以上増えない
-- 1対1のケース
-- user・user_profileがあった場合

-- profileが複数紐づいていれば、u.idが複数でて、 first_name, last_namega
複数でる
-- 複数を発生したくない場合は、uniqをuser_idにつける
select u.id, u.first_name, u.last_name FROM users u
  JOIN user_profile up
    ON up.user_id = u.id;


-- 1対多で、distincを必要とするケース
-- 注文をしているユーザーを数える場合など

SELECT DISTINCT u.id, u.name
FROM users u
JOIN orders o ON o.user_id = u.id;

テーブルの分割イメージ

  • 企業などの情報を分割してるケース
    • 企業テーブル(company)
      • id
    • 企業情報(profile)
      • 企業情報
    • 企業管理(admin)
      • サービス運営者だけ利用するやつ
  • 事実・アクションなどでも分けるのか

パフォーマンス

  • 外部キー
    • インデックスがあれば
  • アルゴリズム
  • 選択するメソッド

マイグレーション

  • リリースに影響するケースがある