Sobes.tech
Back to questions
Senior
3

Как в реляционной базе данных сделать связь многие ко многим? (пример: Автор и Книги)

Companies where asked
Альфа КапиталАльфа Капитал

Answer from AI

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;
}

Такой подход обеспечивает корректное хранение и управление связью многие ко многим.