Найти тему
Logonok

Когда жадность хорошо, и, главное, когда плохо

Оглавление
Когда жадность хорошо, и, главное, когда плохо
Когда жадность хорошо, и, главное, когда плохо

В этой статье расскажу про связь между сущностями в декларативном фреймворке Evado, а также о том, как лучше её использовать. Подробнее о декларативной разработке можно узнать в статье «Создание веб-приложения без программирования».

Итак, во фреймворке Evado сущности приложения могут быть связаны между собой несколькими способами. Первый способ - это обычная ссылка, когда идентификатор привязанного объекта хранится в атрибуте основного объекта. Например, улица хранит ссылку на город, к которому относится.

Второй способ - это обратная ссылка. В этом случае идентификатор текущего объекта хранится в атрибуте привязанного объекта. Например, нам необходимо отобразить в городе все ссылающиеся на него улицы. Для этого в классе «Город» создаётся обратная ссылка «Улицы», в которой ссылочным классом указывается «Улица», а ссылочным атрибутом тот, в котором улица хранит идентификатор города.

Множественная связь

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

Обратная ссылка на статьи в категории
Обратная ссылка на статьи в категории

С одной стороны это удобно и наглядно, с другой могут быть некоторые потери в производительности. В базе данных множественные ссылки хранятся как массив значений. И, например, при выборке статей по категории, необходимо будет просмотреть каждый массив ссылок в статьях, чтобы узнать содержит ли он нужную категорию. Индексация данных работать не будет.

Описанная выше проблема актуальна только для большого количества данных. Несколько тысяч записей (или даже десяток тысяч) не вызовут заметной задержки.

Альтернативой массиву ссылок является промежуточная связь. Например, создается класс «Категория статьи», в котором определяются два ссылочных атрибута - на статью и на категорию. Соответственно, в статье создается обратная ссылка на этот класс.

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

Загрузка связанных объектов

По умолчанию связанные объекты не загружаются вместе с основным, а подгружаются при необходимости дополнительными AJAX запросами. Например, так работает табличное представление ссылочного атрибута. Это уменьшает время открытия формы объекта.

В некоторых ситуациях, когда связанные объекты нужны всегда и сразу, оптимально будет получать их вместе с основным объектом. Для этого служит параметр «Жадная загрузка» на вкладке «Отношение» ссылочного атрибута.

Например, для типа представления «Выпадающий список» выбранное значение при открытии формы отобразится как идентификатор. А при включении жадной загрузки будет отображено строковое представление связанного объекта по его данным.

Жадная загрузка категории вместе со статьей
Жадная загрузка категории вместе со статьей

Еще один пример использования жадной загрузки - это отображение списка объектов с ссылочными атрибутами. В этом случае загрузка связанных объектов будет оптимизирована для массовой выборки и понадобится только один дополнительный запрос к базе данных.

Обратите внимание на такой нюанс. Если у обычных ссылок в объекте хранится идентификатор связанного объекта, то у обратных ссылок ничего нет, только способ получения связанных объектов. Поэтому у обратных ссылок без жадной загрузки значение всегда будет пустое.

Иерархия связей

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

При необходимости за раз можно получить любое количество уровней вложений. За это отвечает параметр «Глубина жадной загрузки» на вкладке «Отношение» ссылочного атрибута. По умолчанию связанные объекты загружаются только на один уровень.

Представление связанных объектов

Жадная загрузка отобразит объекты в том виде, в каком они определены в классе. Изменить это можно двумя способами:

  • Первый способ - это представление с кодовым именем eager, которое будет применяться ко всем объектам данного класса при жадной загрузке.
  • Второй способ - это прямое указание нужного представления в параметре «Жадное представление» на вкладке «Отношение» ссылочного атрибута.
Для отображения списка объектов используется представление с кодовым именем list. Для ссылочного атрибута это можно переопределить в параметре «Представление списка» .

Заключение

Используйте жадную загрузку, если ваши связанные объекты всегда и сразу нужны вместе с основным. Это устранит постоянные дополнительные запросы к серверу.

Не используйте жадную загрузку при большом количестве связанных объектов. Это создаст повышенную нагрузку на веб-сервер, базу данных, канал связи. Кроме того, это просто не дружелюбно по отношению к пользователю - предлагать копаться в куче данных. Лучше применить постраничную навигацию и поиск.

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

Примеры разных типов связей можно увидеть в демонстрационном приложении фреймворка Evado.

Декларативный фреймворк Evado: Создавай! Наполняй! Управляй!
Декларативный фреймворк Evado: Создавай! Наполняй! Управляй!