Приведите пример использования связи «многие-ко-многим» в реляционной базе данных.

«Приведите пример использования связи «многие-ко-многим» в реляционной базе данных.» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Связь «многие-ко-многим» (Many-to-Many) используется, когда сущности одной таблицы могут быть связаны с несколькими сущностями другой таблицы, и наоборот. Для её реализации требуется промежуточная таблица (join table).

Классический пример: система учёта студентов и курсов.

  • Один студент может записаться на несколько курсов.
  • На один курс может быть записано несколько студентов.

Пример реализации на Java с JPA/Hibernate:

@Entity
public class Student {
    @Id
    @GeneratedValue
    private Long id;
    private String name;

    @ManyToMany
    @JoinTable(
        name = "student_course",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private Set<Course> courses = new HashSet<>();
    // Геттеры и сеттеры
}

@Entity
public class Course {
    @Id
    @GeneratedValue
    private Long id;
    private String title;

    @ManyToMany(mappedBy = "courses")
    private Set<Student> students = new HashSet<>();
    // Геттеры и сеттеры
}

Объяснение:

  1. Аннотация @ManyToMany определяет тип связи.
  2. @JoinTable на стороне владельца связи (Student) описывает промежуточную таблицу student_course.
  3. Атрибут mappedBy = "courses" в сущности Course указывает, что связь управляется полем courses в классе Student.

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