0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Помимо связи один-ко-многим, очень распространена связь многие-ко-многим. Например, такой связью обладают курсы и пользователи. С одной стороны, пользователь может проходить множество курсов, с другой, курс проходится большим количеством студентов.</p>
1
<p>Помимо связи один-ко-многим, очень распространена связь многие-ко-многим. Например, такой связью обладают курсы и пользователи. С одной стороны, пользователь может проходить множество курсов, с другой, курс проходится большим количеством студентов.</p>
2
<p>Кажется, что такую связь можно реализовать, сделав зависимую сущность коллекцией с обоих концов, со стороны курса и со стороны пользователя.</p>
2
<p>Кажется, что такую связь можно реализовать, сделав зависимую сущность коллекцией с обоих концов, со стороны курса и со стороны пользователя.</p>
3
<p>На практике же, такая реализация не позволяет смоделировать нашу предметную область правильно. Когда человек вступает в курс, то у него появляется дата вступления в курс, кроме этого, курс можно закончить, а это обязательно должно быть где-то отражено. Эта информация не относится ни к курсу, ни к пользователю, она относится к их связи.</p>
3
<p>На практике же, такая реализация не позволяет смоделировать нашу предметную область правильно. Когда человек вступает в курс, то у него появляется дата вступления в курс, кроме этого, курс можно закончить, а это обязательно должно быть где-то отражено. Эта информация не относится ни к курсу, ни к пользователю, она относится к их связи.</p>
4
<p>Такую связь реализуют с помощью введения третьей сущности, которая может и, обычно, содержит какие-то дополнительные данные появляющиеся только во время создания связи. В случае курсов, мы точно хотим знать когда пользователь начал курс и когда он его закончил. Помимо этого мы можем добавить другую информацию, которая привязана именно к связи, а не к пользователю или курсу.</p>
4
<p>Такую связь реализуют с помощью введения третьей сущности, которая может и, обычно, содержит какие-то дополнительные данные появляющиеся только во время создания связи. В случае курсов, мы точно хотим знать когда пользователь начал курс и когда он его закончил. Помимо этого мы можем добавить другую информацию, которая привязана именно к связи, а не к пользователю или курсу.</p>
5
<p>В случае курсов и пользователей, сущность, которая связывает курсы и пользователи можно назвать CourseMember (участник курса). Вот ее код:</p>
5
<p>В случае курсов и пользователей, сущность, которая связывает курсы и пользователи можно назвать CourseMember (участник курса). Вот ее код:</p>
6
<p>И использование:</p>
6
<p>И использование:</p>
7
<p>Мы связали курсы и пользователей связью многие-ко-многим, при этом получившаяся сущность CourseMember связана с курсом связью один-ко-многим и с пользователем связью один-ко-многим. Визуально это выглядит так.</p>
7
<p>Мы связали курсы и пользователей связью многие-ко-многим, при этом получившаяся сущность CourseMember связана с курсом связью один-ко-многим и с пользователем связью один-ко-многим. Визуально это выглядит так.</p>
8
<p>+----------------+ +---------------------+ +----------------+ | User | | CourseMember | | Course | +----------------+ +---------------------+ +----------------+ | - attributes |1 *| - Course |* 1| - attributes | | - methods |<---------| - User |--------->| - methods | +----------------+ | - startedAt | +----------------+ | - finishedAt | +---------------------+</p>
8
<p>+----------------+ +---------------------+ +----------------+ | User | | CourseMember | | Course | +----------------+ +---------------------+ +----------------+ | - attributes |1 *| - Course |* 1| - attributes | | - methods |<---------| - User |--------->| - methods | +----------------+ | - startedAt | +----------------+ | - finishedAt | +---------------------+</p>
9
<p>Для полной реализации таких связей, нам нужно добавить CourseMember в каждую из зависимых сущностей.</p>
9
<p>Для полной реализации таких связей, нам нужно добавить CourseMember в каждую из зависимых сущностей.</p>
10
10