Это обсуждение само по себе, и некоторые из моих коллег проводят и думают, что я приду сюда и посмотрю, что, если есть общий консенсус по этому вопросу.
В основном это сводится к следующим двум мнениям о вызовах базы данных: 1. Сделайте один большой вызов, чтобы получить все, что может понадобиться для сокращения базы данных, количество вызовов БД. 2. Выполните меньшие отдельные вызовы, основываясь на том, что требуется для уменьшения размера. Вызовы БД
Где это особенно важно, это общий код. Мы будем использовать пример класса Employee, так как это довольно просто.
Предположим, что у вашего класса Employee есть 10 атрибутов значений (имя, фамилия, адресат и т. Д.), А затем 2 атрибута класса ... 1, указывающий на класс Department, а затем 1 супервизор, указывающий на другой объект Employee.
В мышлении № 1 вы должны сделать один вызов, который возвращает данные о сотрудниках, а также поля, необходимые для заполнения атрибутов Department и Supervisor ... или, по крайней мере, поля, которые чаще всего используются из этих подобъектов.
В мышлении № 2 сначала нужно заполнить объект Employee, а затем заполнить только объекты Department и Supervisor, если и когда они действительно запрашиваются.
Позиция 2 довольно прямолинейна ... минимизируйте размер запросов и количество объектов базы данных, которые необходимо обрабатывать каждый раз, когда выполняется один из этих запросов. Позиция # 1 состоит в том, что даже если бы это могло быть реализовано должным образом, сам факт, что код должен был бы сделать многократные соединения, вызовет большую нагрузку на соединение между веб-сервером и базой данных, а не уменьшит его.
Движущая сила исследований заключается в том, что объем трафика между нашим веб-сервером и сервером базы данных выходит из-под контроля.
источник
Ответы:
Если движущей силой этого вопроса является слишком большой трафик, изучали ли вы кеширование часто используемых объектов? Например: ПОСЛЕ того, как вы получаете объекты Employee, Department и Supervisor, возможно, было бы неплохо добавить их в кэш, чтобы в случае их повторного запроса в ближайшем будущем они уже находились в кэше и не нуждались в извлечении. опять таки. Конечно, кэш должен позволить истечь редко используемым объектам, а также должен иметь возможность удалять объекты, которые были изменены приложением и сохранены обратно в базу данных.
В зависимости от того, какой язык и фреймворки вы используете, уже может существовать фреймворк для кеширования, который может выполнять некоторые (или большинство) из того, что вам нужно. Если вы используете Java, вы можете заглянуть в Apache Commons-Cache (я не использовал его некоторое время, и, хотя он выглядит бездействующим, он все еще доступен для использования, и он был довольно приличным в последний раз, когда я его использовал).
источник
Всегда обращайте внимание на удобочитаемость и ясность при первом написании чего-либо. Затем вы можете рефакторинг, если и когда вам нужно. Выполните нагрузочное тестирование, чтобы найти узкие места, во многих случаях это не количество вызовов, вызывающих проблему, а плохо написанные.
Что касается того, что классифицирует как слишком много, это зависит от приложения. Для большинства веб-приложений допустимо менее 30 секунд. Я бы поговорил с вашими пользователями об их ожиданиях.
источник
Ваш вопрос кажется основанным на предположении, что вам нужно угадать, какие данные понадобятся для любой данной страницы. Это не тот случай. Это не так просто, как наивный подход, но вы можете спроектировать свой код, чтобы вы знали, нужны ли вам атрибуты отдела или руководителя, прежде чем делать какие-либо вызовы из базы данных.
источник
Это правила, которые я использую, может быть, они пригодятся вам.
источник
Обе стратегии здесь совершенно верны. У каждого есть свои преимущества и недостатки:
Один звонок для всех 3 объектов:
Один звонок на объект (всего 3 звонка)
источник
На мой взгляд, слишком много запросов к БД делает больше запросов, чем нужно для загрузки данных, которые вам требуются в любой момент времени.
Поэтому, если вам не нужны данные, не тратьте их на память, чтобы избежать повторного путешествия позже. Но если вам нужен объем данных, вы должны минимизировать количество обращений к БД.
Так что имейте оба варианта, и используйте каждый, где ситуация требует этого.
РЕДАКТИРОВАТЬ: Имейте в виду, что этот курс зависит также от вашей ситуации. Например, если это WebApp, у вас должны быть другие соображения, чем для настольного приложения, которое обращается к БД в вашей сети, а не через Интернет для WepApp.
источник
Соединение с БД, отправка запроса и его анализ обычно занимают значительное время по сравнению с получением результатов, поэтому общая тенденция состоит в объединении как можно большего количества запросов в одном запросе.
Тем не менее, выполнение всего этого за один раз сделает код неуправляемым. Вместо этого это обычно достигается дополнительным уровнем абстракции: код планирует несколько запросов по мере необходимости, затем механизм анализирует их как один большой запрос (возможно, с использованием кэша в пути), а затем ответы отправляются по мере необходимости.
Конечно, не всегда все можно получить одним запросом - у вас часто будет запрос, содержащий данные, необходимые для построения следующего запроса, поэтому вам придется повторить его. Все еще ошеломляющие пакеты запросов и выполнение как можно большего количества одновременно лучше, чем сотни маленьких снимков в базе данных.
Поэтому планируйте, что вам нужно, запрашивайте и извлекайте его, если требуется больше, запрашивайте и извлекайте его снова, а затем используйте данные для создания контента. Определенно избегайте использования запросов к базе данных, таких как инициализация локальной переменной, разбросанных по всему коду.
источник
Мы не знаем достаточно о вашей заявке, чтобы знать, какой вариант вы собираетесь оптимизировать слишком рано. Как часто используются данные супервизора? Кажется, это может быть пустой тратой, но мы не знаем. Если вы будете хранить их отдельно, вы сможете контролировать свою систему, чтобы увидеть, как часто они используются вместе. Чем вы можете принять решение просто объединить их в один вызов. В противном случае, если вы начнете создавать бутылочную горловину с этим одним большим вызовом, с чего вы начнете решать проблемы? Сложно определить, что имеет смысл опускать. Дополнительные поля данных могут быть добавлены к этому процессу.
Было бы интересно узнать, сколько из этого исходит от памяти БД против диска. Нет ничего, что могло бы заставить меня почувствовать, что отдел более или менее вероятно изменится по сравнению с адресом.
источник