Моделирование отношений сущностей для сценария x-follow-y - PullRequest
0 голосов
/ 11 августа 2011

Предположим, есть две модели: User и Question.Я могу использовать @OneToMany, чтобы указать, что у одного пользователя может быть несколько вопросов.Теперь, если я хочу позволить пользователю следовать одному или нескольким вопросам, я должен построить модель Follow, которая имеет два свойства: пользователя и вопрос?Или просто добавьте свойство в User модель для списка следующих вопросов?Какой из них лучше?Каков общий принцип проектирования для такого сценария?Учитывая вышеупомянутые операции с базой данных, какой подход будет более эффективным?

1 Ответ

1 голос
/ 11 августа 2011

Ключевая идея здесь заключается в том, что у вопроса есть один задающий вопрос, но несколько последователей.Работая с моделью данных, в которой вы представляете все в виде таблиц, вы должны создать следующую структуру:

USER (id(PK), name, ...)
QUESTION (id(PK), title, text, author(FK to USER))
FOLLOW (userid(FK to USER), questionid (FK to QUESTION))

Поскольку отношение автора одно к многим, от пользователя USER к ВОПРОСУ, и много ко многим между пользователем USER.и ВОПРОС.Таблица FOLLOW - это обычная таблица соединений.

Теперь, когда ORM с JPA, все становится интересным.Да, вы можете избежать явного создания класса Follow, сохранив список вопросов для каждого пользователя.Вам понадобятся @ManyToMany и @JoinTable.Является ли это более эффективным, чем явный класс Follow, возможно, с двумя @ManyToOne с или двумя @OneToMany с?Я не совсем уверен, но я подозреваю, что, поскольку JPA - это просто спецификация и может быть несколько реализаций, возможно, что разные реализации могут отличаться по производительности.Конечно, вы можете попробовать оба способа, написать несколько запросов и посмотреть на сгенерированный SQL.Если вы уже знакомы с методами эффективной стратегии извлечения и у вас есть другие навыки, такие как избегание проблемы выбора n + 1, тогда вы можете найти это забавное упражнение.

Конечно, избегание класса модели для таблицы соединений - это больше ORM-иш, так как вы можете просто сосредоточиться на уровне объекта и не слишком беспокоиться о базовых таблицах.Но хорошо знать, что происходит за кулисами, так как вам все еще нужно понять, как сделать эффективную выборку и как избежать n + 1 выбора и т. Д.

Кроме того, если ваше последующее отношение имеет атрибуты своегоСобственно, вам может показаться, что явный класс модели Follow является хорошей идеей.

Суть в том, что модель «многие ко многим» без модели Follow, вероятно, самая чистая, но выберите то, что лучше всего читатьдля вас, и сделайте некоторое профилирование, если у вас есть какие-либо сомнения.Я верю, что в конечном итоге только просмотр сгенерированного SQL скажет вам то, что вы хотите знать, потому что JPA не определяет SQL.И реализации JPA тоже могут быть довольно умными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...