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

Ответ

В реляционных базах данных выделяют три основных типа связей между таблицами, которые определяют, как записи одной таблицы соотносятся с записями другой.

  1. Один-к-одному (One-to-One, 1:1)

    • Описание: Каждая запись в Таблице А может быть связана не более чем с одной записью в Таблице Б, и наоборот.
    • Реализация: Обычно реализуется через FOREIGN KEY со столбцом, на который наложено ограничение UNIQUE. Часто первичный ключ одной таблицы является одновременно и внешним ключом для другой.
    • Пример: users и user_profiles. У одного пользователя может быть только один профиль.
  2. Один-ко-многим (One-to-Many, 1:N)

    • Описание: Одна запись в Таблице А может быть связана с несколькими записями в Таблице Б, но каждая запись в Таблице Б связана только с одной записью в Таблице А.
    • Реализация: В таблицу на стороне "многих" (Таблица Б) добавляется столбец FOREIGN KEY, который ссылается на PRIMARY KEY таблицы на стороне "одного" (Таблица А).
    • Пример: authors и books. У одного автора может быть много книг, но у каждой книги только один автор.
  3. Многие-ко-многим (Many-to-Many, M:N)

    • Описание: Одна запись в Таблице А может быть связана с несколькими записями в Таблице Б, и наоборот.
    • Реализация: Этот тип связи нельзя реализовать напрямую. Для этого создаётся третья, промежуточная (связующая) таблица (junction table). Эта таблица содержит два поля FOREIGN KEY, которые ссылаются на первичные ключи Таблицы А и Таблицы Б.
    • Пример: students и courses. Один студент может быть записан на много курсов, и на одном курсе может учиться много студентов. Связь реализуется через таблицу student_courses со столбцами student_id и course_id.

Дополнительный тип:

  • Самореферентная связь (Self-Referencing Relationship)
    • Описание: Таблица ссылается сама на себя. Это частный случай связи 1:N, где обе стороны связи находятся в одной таблице.
    • Пример: Таблица employees со столбцом manager_id, который является FOREIGN KEY и ссылается на id в той же таблице employees. Таким образом, можно выстроить иерархию сотрудников.
// Пример связи M:N в Go с использованием GORM

// Модель студента
type Student struct {
    ID      uint   `gorm:"primaryKey"`
    Name    string
    // Указываем, что у студента много курсов, связь через таблицу 'student_courses'
    Courses []Course `gorm:"many2many:student_courses;"`
}

// Модель курса
type Course struct {
    ID      uint   `gorm:"primaryKey"`
    Title   string
    // Указываем, что на курсе много студентов, связь через ту же таблицу
    Students []Student `gorm:"many2many:student_courses;"`
}