Кэширование только данных отношения из результата FuelPHP ORM

Я разрабатываю приложение с помощью FuelPHP и mySql и использую предоставленные функции ORM. Проблема со следующими таблицами:

Таблица: pdm_data

  • Массивная таблица (350+ столбцов, много строк)
  • Данные таблицы довольно статичны (обновляются только раз в сутки)
  • Первичный ключ: obj_id

Таблица: change_request

  • Всего несколько столбцов
  • Данные меняются часто (10-20 раз/мин)
  • Первичный ключ ссылок (obj_id из таблицы pdm_data)

Пользователи могут настроить таблицу данных, которая видна им, например. они могут сохранять фильтры (например, change_request.obj_id=34 AND pdm_data.state = 6) для столбцов, которые затем преобразуются в запрос в реальном времени с помощью ORM.

Однако запросы с ORM очень медленные, так как таблица pdm_data большая, и даже ~100 строк дадут много мегабайт данных. Самая большая проблема, по-видимому, заключается в ORM FuelPHP: даже если сам запрос является относительно быстрым, гидратация модели и т. д. занимает много секунд. Идеальным решением было бы кэшировать результаты из таблицы pdm_data, поскольку она довольно статична. Однако, насколько я знаю, FuelPHP не позволяет кэшировать таблицы через отношения (вы можете кэшировать полный результат запроса, то есть обе таблицы или ни одной).

Кроме того, использование обычного SQL-запроса с объединением вместо ORM не является идеальным решением, так как мне нужно обрабатывать другие задачи, где гидратированные модели великолепны.

В настоящее время у меня есть следующий код:

 //Initialize the query and use eager-loading
 $query = Model_Changerequest::query()->related('pdmdata');


foreach($filters as $filter)
{
 //First parameter can point to either table
 $query->where($filter[0], $filter[1], $filter[2]);
}

$result = $query->get();

...

У кого-нибудь есть хорошее решение для этого?

Спасибо за прочтение!


person Konsta Korhonen    schedule 12.09.2014    source источник


Ответы (1)


Медлительность версии 1 ORM — известная проблема, которая решается в версии 2. Мои текущие тесты показывают, что v1 orm требуется 2,5 секунды (на моей машине, ymmv) для гидратации 40 тыс. строк, в то время как текущая альфа-версия v2 занимает около 800 мс.

На данный момент я боюсь, что самым простым решением будет отказаться от ORM для больших выборок и построить запросы, используя класс DB. Я знаю, что вы сказали, что хотите сохранить абстракцию ORM для облегчения разработки. Одним из решений является использование as_object('MyModel') для возврата заполненных объектов модели.

С другой стороны, если производительность является вашей главной заботой, то ORM просто не подходит.

person Emlyn    schedule 13.09.2014