📝

ポリモーフィック関連のDB設計について考えてみた

2024/09/25に公開

ポリモーフィック関連

ある一つのカラムが複数のテーブルを参照しているようなパターン。
管理者ユーザーと一般ユーザーの権限を管理するDB設計で考えてみた。

テーブル構造

Permissionspermissionable_idにAdminUsersまたはGeneralUsersの主キーが入り、
permissionable_typeでAdminかGeneralどちらか判断している。

問題点

外部キー制約が利用できない

  • 関連するテーブルが動的になってしまうのでFK(外部キー)を設定することができない。
  • AdminUsers, GeneralUsersテーブルに紐付けられないデータが作られてしまう可能性がある。
  • データベースの整合性を手動で管理しなければならなくなるため、エラーや不整合のリスクが高まる。

どのように解決するか

共通の親テーブルの作成

AdminUsersGeneralUsersの共通の親テーブルを作成することで、以下のような改善が可能だと考えられる。

外部キー制約の利用が可能

  • 新しいスキーマでは、Permissionsテーブルがuser_idUsersテーブルに関連付けられているため、外部キー制約を設定でき、データの整合性を確保できるので、権限が無効なユーザーに紐付けられることを防げる。
  • PermissionsUsersに直接関連しており、user_idを利用することでどのユーザー(AdminGeneral)に対する権限か正確に判断できる。

下記のような変更でも対応できそう。

参考文献

https://www.oreilly.co.jp/books/9784873115894/

Discussion