Course contentsShow
← Databases & SQL
Lesson 212 of 1,9533. Relational Algebra in PracticeFree lesson

Handling Many-to-Many Relationships

Design bridge tables to resolve many-to-many set associations cleanly.

In this lesson, you will learn how to resolve many-to-many relationships by introducing an intermediary "bridge" table to maintain data integrity.

The Problem: Many-to-Many

In relational algebra, a true many-to-many relationship exists when multiple records in Table A can relate to multiple records in Table B (and vice-versa). For example, consider Students and Classes. A single student can enroll in many classes, and a single class can contain many students.

If we tried to force this directly into our tables, we would end up with redundant, atomic value decomposition nightmares. We cannot store a list of classes inside a single cell in the Students table without violating the principles of normalization we studied earlier.

The Solution: The Bridge Table

To handle this, we decompose the many-to-many relationship into two one-to-many relationships using a bridge table (also known as a junction or associative table). The bridge table acts as a collection of links, containing nothing but the primary keys from the two entities it connects.

Imagine our Enrollments bridge table:

-- Students table
-- StudentID (PK), Name

-- Classes table
-- ClassID (PK), Subject

-- The Bridge Table
CREATE TABLE Enrollments (
    StudentID INT,
    ClassID INT,
    PRIMARY KEY (StudentID, ClassID)
);

Why This Works

By creating this bridge, we transform a complex, circular set association into a manageable structure that standard relational operations can process:

  1. Set Association: Each row in Enrollments represents a specific intersection between a student and a class.
  2. Join Logic: When you need to find all classes for a student, you perform a standard inner join: Students → Enrollments → Classes.
  3. Data Integrity: Because the bridge table uses the primary keys of the related tables as foreign keys, you ensure that you cannot enroll a non-existent student in a non-existent class.

This design keeps our sets clean, avoids the hazards of Cartesian products that arise from trying to join tables without a common key, and allows for efficient querying using the join patterns we have practiced.

Key Takeaway: Never store lists in columns; instead, decompose many-to-many relationships by creating a bridge table that links foreign keys from two distinct entities.