Назад к вопросам
Альфа Капитал
Senior
4
Как в реляционной базе данных сделать связь многие ко многим? (пример: Автор и Книги)
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
В реляционной базе данных связь многие ко многим реализуется через промежуточную таблицу (join table), которая содержит внешние ключи на обе связанные таблицы.
Пример для связи Автор — Книги:
Таблицы:
authors(id, name)books(id, title)author_book(author_id, book_id)
Таблица author_book содержит пары идентификаторов, связывающие авторов и книги. Таким образом, один автор может быть связан с несколькими книгами, и одна книга — с несколькими авторами.
Пример SQL создания таблиц:
CREATE TABLE authors (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE books (
id INT PRIMARY KEY,
title VARCHAR(200)
);
CREATE TABLE author_book (
author_id INT,
book_id INT,
PRIMARY KEY (author_id, book_id),
FOREIGN KEY (author_id) REFERENCES authors(id),
FOREIGN KEY (book_id) REFERENCES books(id)
);
В Java с использованием JPA можно описать это так:
@Entity
public class Author {
@Id
private Long id;
@ManyToMany
@JoinTable(
name = "author_book",
joinColumns = @JoinColumn(name = "author_id"),
inverseJoinColumns = @JoinColumn(name = "book_id")
)
private Set<Book> books;
}
@Entity
public class Book {
@Id
private Long id;
@ManyToMany(mappedBy = "books")
private Set<Author> authors;
}
Такой подход обеспечивает корректное хранение и управление связью многие ко многим.