Java: Объектно-ориентированный дизайн
Теория: Связь многие ко многим
Помимо связи один-ко-многим, очень распространена связь многие-ко-многим. Например, такой связью обладают курсы и пользователи. С одной стороны, пользователь может проходить множество курсов, с другой, курс проходится большим количеством студентов.
Кажется, что такую связь можно реализовать, сделав зависимую сущность коллекцией с обоих концов, со стороны курса и со стороны пользователя.
На практике же, такая реализация не позволяет смоделировать нашу предметную область правильно. Когда человек вступает в курс, то у него появляется дата вступления в курс, кроме этого, курс можно закончить, а это обязательно должно быть где-то отражено. Эта информация не относится ни к курсу, ни к пользователю, она относится к их связи.
Такую связь реализуют с помощью введения третьей сущности, которая может и, обычно, содержит какие-то дополнительные данные появляющиеся только во время создания связи. В случае курсов, мы точно хотим знать когда пользователь начал курс и когда он его закончил. Помимо этого мы можем добавить другую информацию, которая привязана именно к связи, а не к пользователю или курсу.
В случае курсов и пользователей, сущность, которая связывает курсы и пользователи можно назвать CourseMember (участник курса). Вот ее код:
И использование:
Мы связали курсы и пользователей связью многие-ко-многим, при этом получившаяся сущность CourseMember связана с курсом связью один-ко-многим и с пользователем связью один-ко-многим. Визуально это выглядит так.
+----------------+ +---------------------+ +----------------+
| User | | CourseMember | | Course |
+----------------+ +---------------------+ +----------------+
| - attributes |1 *| - Course |* 1| - attributes |
| - methods |<---------| - User |--------->| - methods |
+----------------+ | - startedAt | +----------------+
| - finishedAt |
+---------------------+
Для полной реализации таких связей, нам нужно добавить CourseMember в каждую из зависимых сущностей.

