Developer Permission
Overview
プロジェクトにおいての権限周りの開発方法をまとめたセクション。
とても良い論点です。 このようなユーザー属性(役割)にバリエーションがある場合、以下のように考えると整理しやすくなります。
ユーザー属性の持ち方
「ユーザーの属性をマスターテーブルとして持つ」方式が推奨。 その理由を、アーキテクチャ・保守性・拡張性の観点から詳しく解説します。
🧱 2つのアプローチ比較
| 方針 | 説明 | メリット | デメリット |
|---|---|---|---|
| ① ユーザーテーブルにフラグを持つ(enum / boolean) | role カラムを user, admin, creator にするなど | 実装が最短で済む、クエリが楽 | 条件が複雑化しやすい、柔軟性に欠ける |
| ② 属性をマスターテーブルに切り出す | user_roles や user_types のようなテーブルを作る | 柔軟にロールを追加・変更できる、集約/集計にも強い | 実装がやや複雑(JOINが必要) |
1. 複数ロールを持つ可能性があるか?
たとえば将来的に「本人がファンクラブ運営しつつ、他ファンクラブにも加入できる」や 「サポートユーザーが本人代理として投稿する」などのユースケースがあるなら
→ **多対多の構造(=属性を別テーブルで管理)**が絶対に必要
2. 属性に応じて別テーブルや処理が必要か?
「本人」ユーザーには fanclub の所有関係があり、 「通常ユーザー」には subscription の関係があるように:
→ 属性によって他テーブルとの関係が変わるなら、明示的な区別(タイプ情報)が必要。
この場合、役割(ロール)を正規化して別テーブルに持つ方が管理しやすいです。
3. 将来的な拡張・権限管理はどうするか?
もし将来的に: • サポートユーザーにも権限の粒度(閲覧専用、編集権限など)を持たせたい • 「本人」ユーザーにも代理管理者を追加したい
といった要件が発生しうるなら:
→ user_roles + user_role_permissions のような構造が拡張性に優れます。
⸻
📐 推奨設計パターン
ユーザー属性を外部テーブルで管理するパターン(シンプル版)
users └── user_roles (多対多) ├── user_id ├── role_id └── context_id (optional: ファンクラブIDなど)
roles (マスタ) ├── id └── name ('user', 'admin', 'creator' など)
• ユーザーは1つ以上の役割を持てる。 • creator は特定のファンクラブと紐づけることで文脈に依存させられる(=スケーラブル)。
⸻
✅ まとめ:どっちを選ぶべきか?
条件 おすすめアプローチ ユーザーの属性が1つに決まっており今後も変わらない userテーブルのenumカラムでもOK 複数の役割を持たせたい/将来の拡張を見越したい 属性マスタ+リレーション(多対多)方式がベター 属性に応じて関連テーブル・処理が分かれる 属性マスタ必須。責務が明確になる
⸻
👀 付け加えるなら…
この構造に @Relation('roles') のように TypeORM の ManyToMany を使っても良いですし、 ドメイン駆動的に User.hasRole('creator', fanclubId) などのメソッドを User エンティティに持たせると、より読みやすいコードになります。