Я публикую этот вопрос как независимый от языка и фреймворка, так как думаю, что он может быть общим для ORM Frameworks.
Мне интересно, может ли кто-нибудь сказать мне, существует ли шаблон проектирования для следующего использования?case:
Вариант использования
Система представляет собой веб-приложение Model-View-Controller, работающее с ORM Framework.
Существует два объектав игре Poll
и Vote
.
Один Poll
имеет отношение one-to-many
с Vote
, а голоса находятся в коллекции, которая Lazy Loaded .
Каждый пользователь в системе может голосовать только один раз.
Для удобства пользователей было бы неплохо, чтобы View
адаптировался, показывая элементы управления только для опросов, в которых текущий пользовательеще не проголосовал, поэтому Poll
имеет метод (в псевдокоде):
public boolean hasVoteFor(user) {
for each vote
if vote.user == user
return true
return false
}
, так что когда View
передается Poll
с помощью Controller
, он может отобразить правильные элементы управления с помощьюif poll.hasVoteFor(user)
.
Проблема
Проблема с описанным выше методом заключается в том, что, поскольку коллекция является отложенной загрузкой, ее перебор может стать очень ресурсоемким и занимать дБ.
Используя SQL / DQL / SQL, вы, очевидно, можете использовать базу данных для прямого запроса1041 * сущности, за которых проголосовал пользователь, однако любой такой запрос должен происходить в хранилище, которое, как я предполагаю, View
не должно иметь доступа.
Решения?
Так что мне интересно, есть ли шаблон проектирования для решения этой проблемы.
Должен ли Controller
иметь такой метод, как hasVoteFor(poll, user)
?Это проблематично, если представление отображает несколько опросов.(Запрос с множеством критериев для каждого опроса будет быстрее, чем многократный выбор, поскольку View
повторяет Poll
с, которые ему даны.)
Если Controller
используйте репозиторий для запроса всех Poll
, за которые пользователь проголосовал заранее, и передайте его View
вместе с Poll
(или массивом Poll
).Этот вид ломает аккуратную абстракцию метода Poll
с hasVoteFor
- разве ORM не должен позволять вам думать только о ваших объектах?;)
Какое-то другое часто используемое на практике решение, которое я пропускаю?