> Если речь о десятках и более тысяч документов, то это поможет: habrahabr.ru/post/253737/ > Но этот вариант не всегда реализуем. Как, например, в моём случае. > В целом по проекту: сочувствую…
Некоторые TV всё-таки пришлось разместить в таблице ресурсов. А именно — числовые поля. И только те числовые, по которым выполняется фильтрация (на больше/меньше) и сортировка. Т.к.:
а) во всех остальных случаях фильтрация и сортировка вполне себе нормально отработает и по строковым TV (с использованием индекса)
б) с числовыми TV-полями при выполнении сортировки и фильтрации (на больше/меньше) пришлось бы выполнять преобразование на лету и как следствие, полный перебор БЕЗ использования индексов
в) в нашем распоряжении имеется всего 44 индекса (64 минус 20 стандартных), соответственно, все TV в таблицу ресурсов не закинешь. Закидываю только необходимый минимум (числовая сортировка/фильтрация)
Но логику, описанную в статье, немного изменил (под свой проект):
1.Числовые TV не перемещаю в таблицу ресурсов, а копирую. Памяти уходит больше, но упрощается логика + повышается безопасность (если что «поломается», всегда можно восстановить значения из стандартных TV)
2.Схему (modx->map) дополняю новыми полями также на лету, но не вручную, а программно — на основе структуры таблицы в БД (использую генератор xPDOGenerator)
3.Описание индексов новых полей в (modx->map) не помещаю, т.к. индексы xpdo нужны только для генерации таблиц в БД (или нужны для чего-то ещё ?)
— Таким образом, получилась гибридная система TV-параметров:
1.Для выборки TV используется поле (properties)
2.Для фильтрации и сортировки по числовым полям используются собственные поля в таблице ресурсов (числовое сравнение)
3.Для фильтрации и сортировки по строковым полям — TV-поля подключаются через join (строковое сравнение)
При такой организации TV:
а) и выборку большого числа TV можно будет сделать довольно быстро (без кучи JOIN'ов)
б) можно быстро (с использованием индекса) выполнять фильтрацию и сортировку как по строковым полям (строковое сравнение), так и по числовым полям (числовое сравнение), исключая преобразование типов на лету
в) можно не заморачиваться тем, что в таблице ресурсов остаётся всего 44 индекса для собственных полей (для числовых полей, по которым выполняется фильтрация/сортировка, их всем хватит)