Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 属性を持つ多対多リレーションシップの扱い | セクション
データベース設計パターン

book属性を持つ多対多リレーションシップの扱い

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

多くのデータベース設計において、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つのエンティティ間のリレーションシップに関する追加情報はどのように保存するか?

question mark

なぜ多対多リレーションシップに属性を追加する必要があるのか?

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

question mark

関連テーブルの目的は何か?

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

question mark

2つのエンティティ間のリレーションシップに関する追加情報はどのように保存するか?

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

すべて明確でしたか?

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

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

セクション 1.  10

AIに質問する

expand

AIに質問する

ChatGPT

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

セクション 1.  10
some-alt