Как подружить объектый подход взаимодействия с БД и ресурсоёмкую аналитику?
Читая М. Фаулера, начал думать что DataMapper это некий эталон взаимодействия с БД в объектно-ориентированных языках. И всё в нём хорошо, но, например, в одном из моих проектов, есть множество отчётов, и сейчас почти для каждого отчёта делаются запросы с JOIN.
Проект переписывается на ООП и скоро дело дойдёт до этих самых отчётов. Скорость их генерации и так оставляла желать лучшего, а теперь вообще должна упасть.
Оставлять эти запросы как есть нельзя - отчёты используют логику предметной области, которая пишется в моделях и не сможет быть применена к сырым данным.
Пока думаю, что для отчётов необходимо применить другой подход - рассчитывать значения отчётов всё теми же моделями, но результат записывать в отдельные таблицы. Соответственно расчёты вести по крону раз в N часов, а отчёт отдавать из таблицы.
На самом деле, имхо, что бы достичь максимальной скорости генерации отчетов при запросе, нужно просто перестать их генерировать при запросе.
Генерируйте заранее.
По поводу DataMapper: Производительности проседает обычно при селекте большого кол-ва записей. Конечно, этот паттерн, добавляет +1 уровень абстракции, позволяя вам не работать с SQL напрямую. Вы всегда можете обойтись без него.
CQRS, DataMapper на запись (легко поддерживать, относительно медленно на запись и чтение, очень медленно со сложными запросами), агрегации данных на чтение (легко поддерживать, быстро на чтение)