Когда целесообразно использовать двунаправленную связь, а когда нет?

Предположим, что мы хотим создать приложение типа eBay, в котором у нас есть объект с именем Customer и объект с именем Order.

С реляционной точки зрения я бы моделировал это как:

Customer
+----+-----+
| ID | ... |
+----+-----+

Order
+----+-------------+-----+
| ID | CUSTOMER_ID | ... |
+----+-------------+-----+

Теперь, когда я хочу сопоставить это с JPA, у меня есть несколько вариантов:

  • Создайте однонаправленную связь "все-к-одному" от "Заказ клиенту". ИМХО, это самое близкое к реляционной модели. Недостатком является то, что для того, чтобы найти все заказы для данного клиента, я должен написать запрос JPQL, поскольку клиент ничего не знает о его заказах. Также я не могу естественным образом добавить новый заказ для клиента (например, customer.addOrder(aNewOrder);).

  • Создайте связь "один ко многим" от Заказчика к заказу. Таким образом, чтобы найти все заказы для данного клиента, я могу использовать customer.getOders(), и я могу добавить новые заказы для клиента естественным способом. Недостатком является то, что для того, чтобы узнать клиента, который разместил данный заказ, я должен использовать JPQL.

  • Создайте двунаправленную связь "один ко многим" от клиента к заказу. Таким образом, мне не нужно писать какие-либо запросы JPQL для извлечения всех заказов клиента или клиента, разместившего данный заказ. Недостатком является то, что добавлена ​​сложность для поддержания двунаправленной связи.

Таким образом, я не вижу определенного аргумента в отношении того, нужно ли использовать однонаправленную связь или двунаправленная ассоциация является "правильной". Другими словами, мне кажется, что все это сводится к личным предпочтениям и вкусу дизайнера/исполнителя модели.

Я прав или есть правила, согласно которым можно определить правильную направленность для данной ассоциации?

Ответ 1

Многое зависит от вашего ожидаемого количества заказов на одного клиента. Если вы ожидаете много заказов на одного клиента (думаю, eBay), то наличие клиента со всеми связанными с ним заказами не будет очень эффективным (или потребует усилий для поддержки как ленивой ассоциации). В этом случае я рекомендую подход №1. Нет ничего плохого в написании некоторых запросов.

Однако, если вы ожидаете в основном клиентов с несколькими заказами, то двунаправленный подход №3 будет работать нормально.

Я не вижу большого значения в # 2, поскольку порядок всегда связан с одним клиентом.