属性を持つ多対多リレーションシップの扱い
メニューを表示するにはスワイプしてください
多くのデータベース設計において、2つのエンティティ間に多対多のリレーションシップが存在する状況が発生します。例えば、従業員は複数のプロジェクトに割り当てられることができ、各プロジェクトも複数の従業員を含むことができます。これを表現するために、連結テーブル(ジョインテーブルやブリッジテーブルとも呼ばれる)を使用し、両エンティティの主キーの組み合わせを格納します。しかし、時にはリレーションシップ自体に関する追加情報、例えば従業員がプロジェクトで担うrole(役割)、割り当て日、またはアロケーションの割合などを保存する必要があります。このような場合、属性を連結テーブルに直接追加し、リレーションシップにさらなる文脈や詳細を持たせます。
-- Associative table linking employees and projects, with an additional 'role' attribute
CREATE TABLE project_assignments (
employee_id INTEGER NOT NULL REFERENCES employees(employee_id),
project_id INTEGER NOT NULL REFERENCES projects(project_id),
role VARCHAR(50) NOT NULL,
assigned_date DATE DEFAULT CURRENT_DATE,
PRIMARY KEY (employee_id, project_id)
);
-- Sample data: assigning employees to projects with roles
INSERT INTO project_assignments (employee_id, project_id, role, assigned_date) VALUES
(1, 1, 'Project Manager', '2024-05-01'),
(2, 1, 'Developer', '2024-05-10'),
(3, 3, 'Support Specialist', '2024-06-01'),
(5, 2, 'HR Assistant', '2024-06-05');
連結テーブルに属性を追加することで、これらの属性を簡単にクエリや更新でき、リレーションシップに関する洞察を得ることができます。例えば、特定のプロジェクトに割り当てられている従業員とその役割を調べたり、特定プロジェクトにおける従業員の役割を更新したりすることが可能です。連結テーブルの構造により、リレーションシップ固有のデータが1か所にまとめて保存され、コアとなるエンティティテーブルとは分離されているため、柔軟かつ効率的な管理が実現します。
-- Query: Find all employees assigned to the 'Website Redesign' project along with their roles
SELECT
e.employee_id,
e.first_name,
e.last_name,
pa.role,
pa.assigned_date
FROM
project_assignments pa
JOIN employees e ON pa.employee_id = e.employee_id
JOIN projects p ON pa.project_id = p.project_id
WHERE
p.name = 'Website Redesign';
連結テーブルに属性を追加することは、エンティティ間の現実世界の豊かな関係性をモデル化するための強力なパターンです。これにより、データベースは誰がと何が関係しているかだけでなく、どのように、どのような役割で関係しているかまで答えることができ、データの正規化と保守性も維持されます。
1. なぜ多対多リレーションシップに属性を追加する必要があるのか?
2. 関連テーブルの目的は何か?
3. 2つのエンティティ間のリレーションシップに関する追加情報はどのように保存するか?
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください