Ответ
В реляционных базах данных выделяют три основных типа связей между таблицами, которые определяют, как записи одной таблицы соотносятся с записями другой.
Один-к-одному (One-to-One, 1:1)
- Описание: Каждая запись в Таблице А может быть связана не более чем с одной записью в Таблице Б, и наоборот.
- Реализация: Обычно реализуется через
FOREIGN KEY
со столбцом, на который наложено ограничениеUNIQUE
. Часто первичный ключ одной таблицы является одновременно и внешним ключом для другой. - Пример:
users
иuser_profiles
. У одного пользователя может быть только один профиль.
Один-ко-многим (One-to-Many, 1:N)
- Описание: Одна запись в Таблице А может быть связана с несколькими записями в Таблице Б, но каждая запись в Таблице Б связана только с одной записью в Таблице А.
- Реализация: В таблицу на стороне "многих" (Таблица Б) добавляется столбец
FOREIGN KEY
, который ссылается наPRIMARY KEY
таблицы на стороне "одного" (Таблица А). - Пример:
authors
иbooks
. У одного автора может быть много книг, но у каждой книги только один автор.
Многие-ко-многим (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;"`
}