Какие бывают типы отношений между таблицами в реляционной базе данных?

«Какие бывают типы отношений между таблицами в реляционной базе данных?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Отношения (связи) между таблицами в реляционной БД определяют, как строки одной таблицы соотносятся со строками другой. Основные типы:

  1. Один к одному (One-to-One, 1:1) Каждой записи в таблице A соответствует не более одной записи в таблице B, и наоборот. Часто используется для разделения редко используемых или конфиденциальных данных.

    CREATE TABLE users (
        user_id INT PRIMARY KEY,
        username VARCHAR(50) NOT NULL
    );
    
    CREATE TABLE user_profiles (
        profile_id INT PRIMARY KEY,
        user_id INT UNIQUE NOT NULL, -- Ключ для связи 1:1
        passport_data VARCHAR(100),
        FOREIGN KEY (user_id) REFERENCES users(user_id)
    );
  2. Один ко многим (One-to-Many, 1:N) Наиболее распространённый тип. Одна запись в таблице «родитель» (A) может быть связана с несколькими записями в таблице «потомок» (B).

    CREATE TABLE authors (
        author_id INT PRIMARY KEY,
        name VARCHAR(100)
    );
    
    CREATE TABLE books (
        book_id INT PRIMARY KEY,
        title VARCHAR(200),
        author_id INT, -- Внешний ключ, ссылается на authors
        FOREIGN KEY (author_id) REFERENCES authors(author_id)
    );
    -- Один автор (author_id = 1) может написать много книг.
  3. Многие ко многим (Many-to-Many, M:N) Реализуется через промежуточную таблицу (junction/association table). Каждая запись в таблицах A и B может быть связана со многими записями другой таблицы.

    CREATE TABLE students (student_id INT PRIMARY KEY, name VARCHAR(100));
    CREATE TABLE courses (course_id INT PRIMARY KEY, title VARCHAR(100));
    
    -- Промежуточная таблица
    CREATE TABLE enrollments (
        student_id INT,
        course_id INT,
        enrollment_date DATE,
        PRIMARY KEY (student_id, course_id),
        FOREIGN KEY (student_id) REFERENCES students(student_id),
        FOREIGN KEY (course_id) REFERENCES courses(course_id)
    );
    -- Студент может записаться на несколько курсов, и на курс может быть записано много студентов.

    Правильное проектирование связей обеспечивает целостность данных, устраняет аномалии и дублирование.