Я разрабатываю приложение с помощью 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();
...
У кого-нибудь есть хорошее решение для этого?
Спасибо за прочтение!