ORM: шаблон для фильтрации отложенной коллекции на объекте - PullRequest
0 голосов
/ 29 февраля 2012

Я публикую этот вопрос как независимый от языка и фреймворка, так как думаю, что он может быть общим для 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 не должен позволять вам думать только о ваших объектах?;)

  • Какое-то другое часто используемое на практике решение, которое я пропускаю?

1 Ответ

1 голос
/ 29 февраля 2012

ORM - это просто инструмент, который поможет вам с вашей базой данных.Но база данных по-прежнему лучший инструмент для эффективного запроса данных, которые вы хотите отобразить.А использование ORM без понимания и заботы о базе данных и генерируемых запросах - это путь к катастрофе.

Ваше второе решение лучше первого, но оно все же не так логично и эффективно, как могло быбыть.

Вместо того, чтобы запрашивать отображение опроса или опросов, а затем запрашивать опросы, за которые проголосовал пользователь, и передавать эти две коллекции в представление, контроллер может выполнить запрос, который возвращает списокЭкземпляры PollWithVoteFlag, содержащие данные каждого опроса, а также флаг, указывающий, проголосовал ли пользователь за опрос.

...