Ответ
В реляционных базах данных выделяют три основных типа связей, которые определяют, как записи в одной таблице соотносятся с записями в другой.
-
Один к одному (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 // Внешний ключ } - Пример:
-
Один ко многим (One-to-Many, 1:N) Одна запись в таблице А может быть связана с несколькими записями в таблице Б, но запись из Б связана только с одной записью из А. Это самый распространенный тип связи.
- Пример:
АвторыиКниги. У одного автора может быть много книг, но у книги — только один автор. - Реализация: Внешний ключ добавляется в таблицу на стороне "многих" (
Книги), который ссылается на первичный ключ таблицы на стороне "одного" (Авторы).
type Author struct { gorm.Model Name string Books []Book // У автора много книг } type Book struct { gorm.Model Title string AuthorID uint // Внешний ключ } - Пример:
-
Многие ко многим (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;"` } - Пример:
Правильное определение этих связей на этапе проектирования схемы данных является ключом к созданию эффективной и масштабируемой базы данных.