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

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

Ответ

Связи в реляционных БД — это фундаментальная концепция, реализуемая через внешние ключи (Foreign Keys, FK). Внешний ключ в одной таблице ссылается на первичный ключ (Primary Key, PK) в другой, что обеспечивает целостность данных и позволяет строить отношения.

Основные типы связей:

  1. Один-ко-многим (1:N) — самый распространённый

    • Пример: Один автор написал много книг.
    • Реализация: В таблице books создаётся столбец author_id, который является внешним ключом, ссылающимся на id в таблице authors.
      
      CREATE TABLE authors (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(100) NOT NULL
      );

    CREATE TABLE books ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255) NOT NULL, author_id INT NOT NULL, FOREIGN KEY (author_id) REFERENCES authors(id) ON DELETE CASCADE );

    
    *   `ON DELETE CASCADE` означает, что при удалении автора все его книги будут удалены автоматически. Другие варианты: `RESTRICT` (запретить удаление), `SET NULL`.
  2. Многие-ко-многим (M:N)

    • Пример: Студенты записываются на курсы. Один студент может быть на многих курсах, один курс может иметь много студентов.
    • Реализация: Требуется промежуточная таблица связи (junction table), которая содержит два внешних ключа.
      
      CREATE TABLE students (id INT PRIMARY KEY, name VARCHAR(100));
      CREATE TABLE courses (id INT PRIMARY KEY, title VARCHAR(100));

    CREATE TABLE student_courses ( student_id INT, course_id INT, PRIMARY KEY (student_id, course_id), -- Составной первичный ключ FOREIGN KEY (student_id) REFERENCES students(id), FOREIGN KEY (course_id) REFERENCES courses(id) );

  3. Один-к-одному (1:1)

    • Пример: Пользователь и его паспортные данные.
    • Реализация: Внешний ключ можно разместить в любой из таблиц, часто с добавлением уникального ограничения (UNIQUE), чтобы запретить дублирование связи.
      CREATE TABLE users (id INT PRIMARY KEY, login VARCHAR(50));
      CREATE TABLE passports (
      id INT PRIMARY KEY,
      user_id INT UNIQUE NOT NULL, -- Уникальность обеспечивает связь 1:1
      number VARCHAR(20),
      FOREIGN KEY (user_id) REFERENCES users(id)
      );

Зачем это нужно: Связи предотвращают появление "сиротствующих" записей (например, книги без автора) и позволяют СУБД эффективно выполнять операции JOIN для выборки связанных данных.