Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ ポリモーフィックアソシエーション | セクション
データベース設計パターン

bookポリモーフィックアソシエーション

メニューを表示するにはスワイプしてください

ポリモーフィック関連は、1つのテーブルが複数の他のテーブルを参照できるようにすることで、データベース設計に柔軟で動的なリレーションシップを実現する手法。コメント添付ファイルなどのレコードを、カラムの重複や各対象ごとの個別の関連テーブルを作成することなく、複数種類のエンティティに関連付けたい場合に有用。例えば、commentsテーブルの各コメントがprojectまたはtaskのいずれかに紐付けられるようにしたい場合、各対象ごとに個別の外部キーを持つのではなく、ポリモーフィック関連では2つのカラム(関連レコードのタイプを格納するカラムと、その一意識別子を格納するカラム)を使用する。このアプローチは、コンテンツ管理システムやアクティビティフィード、監査など、エンティティ同士を柔軟に紐付ける必要があるアプリケーションで特に有効。

1234567891011121314
-- Table: comments (polymorphic association to projects or tasks) CREATE TABLE comments ( comment_id SERIAL PRIMARY KEY, content TEXT NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW(), commentable_type VARCHAR(20) NOT NULL CHECK (commentable_type IN ('Project', 'Task')), commentable_id INTEGER NOT NULL ); -- Example: Insert comments referencing a project and a task INSERT INTO comments (content, commentable_type, commentable_id) VALUES ('Great progress on the website redesign!', 'Project', 1), ('Remember to update the documentation.', 'Task', 2);
copy

ポリモーフィック関連は大きな柔軟性をもたらす一方で、いくつかの複雑さやトレードオフも伴う。

利点:

  • 各関連ごとに複数の外部キーや結合テーブルを作成する必要がなく、スキーマの煩雑さを軽減;
  • コメントがどのエンティティに紐付いているかに関わらず、すべてのコメントを簡単に取得できるクエリが可能。

欠点:

  • 標準的な外部キー制約では複数テーブルを参照できないため、参照整合性の維持が困難;
  • 適切なカスケード処理がない場合、参照先のプロジェクトやタスクが削除されると孤立レコードが発生する可能性;
  • タイプごとにまたがるクエリには追加のロジックが必要となり、動的なタイプ情報に基づく複数テーブルの結合が必要な場合はパフォーマンスが低下することもある。

リレーショナルデータベースでこのパターンを成功裏に利用するには、慎重な設計と一貫した命名規則が不可欠。

123456789101112131415161718192021222324
-- Retrieve all comments for a specific project (project_id = 1) SELECT * FROM comments WHERE commentable_type = 'Project' AND commentable_id = 1; -- Retrieve all comments for a specific task (task_id = 2) SELECT * FROM comments WHERE commentable_type = 'Task' AND commentable_id = 2; -- Retrieve all comments, showing what they reference SELECT c.comment_id, c.content, c.created_at, c.commentable_type, CASE WHEN c.commentable_type = 'Project' THEN p.name WHEN c.commentable_type = 'Task' THEN t.title ELSE NULL END AS referenced_name FROM comments c LEFT JOIN projects p ON c.commentable_type = 'Project' AND c.commentable_id = p.project_id LEFT JOIN tasks t ON c.commentable_type = 'Task' AND c.commentable_id = t.task_id;
copy

1. データベース設計におけるポリモーフィック関連とは何ですか?

2. ポリモーフィック関連を使用する際の潜在的な欠点は何ですか?

3. ポリモーフィック関連は、従来の外部キーとどのように異なりますか?

question mark

データベース設計におけるポリモーフィック関連とは何ですか?

正しい答えを選んでください

question mark

ポリモーフィック関連を使用する際の潜在的な欠点は何ですか?

正しい答えを選んでください

question mark

ポリモーフィック関連は、従来の外部キーとどのように異なりますか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  8

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  8
some-alt