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

Ответ

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

  1. Один к одному (One-to-One, 1:1) Одна запись в таблице А соответствует не более чем одной записи в таблице Б, и наоборот.

    • Пример: Пользователи и ПаспортныеДанные. У одного пользователя может быть только один паспорт.
    • Реализация: Внешний ключ (foreign key) в одной из таблиц, который ссылается на первичный ключ другой и имеет ограничение UNIQUE.
    // Пример для GORM ORM
    type User struct {
        gorm.Model
        Name     string
        Passport Passport // У пользователя есть один паспорт
    }
    
    type Passport struct {
        gorm.Model
        Number string
        UserID uint // Внешний ключ
    }
  2. Один ко многим (One-to-Many, 1:N) Одна запись в таблице А может быть связана с несколькими записями в таблице Б, но запись из Б связана только с одной записью из А. Это самый распространенный тип связи.

    • Пример: Авторы и Книги. У одного автора может быть много книг, но у книги — только один автор.
    • Реализация: Внешний ключ добавляется в таблицу на стороне "многих" (Книги), который ссылается на первичный ключ таблицы на стороне "одного" (Авторы).
    type Author struct {
        gorm.Model
        Name  string
        Books []Book // У автора много книг
    }
    
    type Book struct {
        gorm.Model
        Title    string
        AuthorID uint // Внешний ключ
    }
  3. Многие ко многим (Many-to-Many, N:M) Одна запись в таблице А может быть связана с несколькими записями в таблице Б, и наоборот.

    • Пример: Студенты и Курсы. Студент может посещать много курсов, и на одном курсе может учиться много студентов.
    • Реализация: Создается третья, связующая (junction) таблица, которая содержит внешние ключи к обеим таблицам (например, student_id и course_id).
    type Student struct {
        gorm.Model
        Name    string
        Courses []*Course `gorm:"many2many:student_courses;"`
    }
    
    type Course struct {
        gorm.Model
        Name     string
        Students []*Student `gorm:"many2many:student_courses;"`
    }

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