Open2
DB設計

テーブル設計
- 単一
- 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)
- サービス運営者だけ利用するやつ
- 企業テーブル(company)
- 事実・アクションなどでも分けるのか
パフォーマンス
- 外部キー
- インデックスがあれば
- アルゴリズム
- 選択するメソッド
マイグレーション
- リリースに影響するケースがある