modX НЕ хранит значения множеств TV в разных полях
Почему modX не хранит значения множественных TV в отдельных строках таблицы modx_site_tmplvar_contentvalues ?
Как известно, modX хранит значения множественных TV-полей («Флажки» и «Список (множественный выбор)») в виде строк:
value1||value2||value3||…
Если требуется фильтровать ресурсы по этому TV, то в ходе выполнения запроса придётся разбирать такие строки на предмет наличия в них нужного значения. А такой разбор — это же трудоёмкая операция. К тому же в таблице modx_site_tmplvar_contentvalues нет индекса ни по полю value, ни по полям tmplvarid + value Как следствие, запросу придётся просматривать ВСЕ записи в таблице modx_site_tmplvar_contentvalues и для каждой такой записи разбирать строку-значение нашего TV-параметра. На большом числе ресурсов загрузка страниц будет тормозить.
По всем правилам проектирования БД множественные TV должны быть организованы следующим образом:
1. Каждое значение множественного TV хранится в отдельной строке таблицы modx_site_tmplvar_contentvalues
2. В таблице modx_site_tmplvar_contentvalues должен присутствовать индекс по полям «tmplvarid» + «value».
Не могу понять, каким образом разработчики modX могли допустить такое упущение?
Может, я чего-то недопонимаю? Или, может, есть какие-то принципиальные проблемы с такой реализацией?
Вроде бы, это всё элементарно просто и элементарно очевидно…
Как известно, modX хранит значения множественных TV-полей («Флажки» и «Список (множественный выбор)») в виде строк:
value1||value2||value3||…
Если требуется фильтровать ресурсы по этому TV, то в ходе выполнения запроса придётся разбирать такие строки на предмет наличия в них нужного значения. А такой разбор — это же трудоёмкая операция. К тому же в таблице modx_site_tmplvar_contentvalues нет индекса ни по полю value, ни по полям tmplvarid + value Как следствие, запросу придётся просматривать ВСЕ записи в таблице modx_site_tmplvar_contentvalues и для каждой такой записи разбирать строку-значение нашего TV-параметра. На большом числе ресурсов загрузка страниц будет тормозить.
По всем правилам проектирования БД множественные TV должны быть организованы следующим образом:
1. Каждое значение множественного TV хранится в отдельной строке таблицы modx_site_tmplvar_contentvalues
2. В таблице modx_site_tmplvar_contentvalues должен присутствовать индекс по полям «tmplvarid» + «value».
Не могу понять, каким образом разработчики modX могли допустить такое упущение?
Может, я чего-то недопонимаю? Или, может, есть какие-то принципиальные проблемы с такой реализацией?
Вроде бы, это всё элементарно просто и элементарно очевидно…
Комментарии: 4
А то, что все значения ТВ в БД являются типом text, и там нет нормальных индексов тебя не смущает?
По моему, очевидно, что если нужна сортировка и скорость — нужно использовать свою таблицу, куда можно дублировать и ТВ и что угодно, и искать уже по ней.
Вот пример такого решения.
По моему, очевидно, что если нужна сортировка и скорость — нужно использовать свою таблицу, куда можно дублировать и ТВ и что угодно, и искать уже по ней.
Вот пример такого решения.
Вот это же самое, только под Revo github.com/AgelxNash/TagFaster
Ясно. Думал, что это в настройках можно отрегулировать.
Только мне всё-равно не понятно, почему мультиТВ в modX реализовали так убого? Ведь уже 3-я версия на горизонте…
Только мне всё-равно не понятно, почему мультиТВ в modX реализовали так убого? Ведь уже 3-я версия на горизонте…
Предложи свою, «неубогую» реализацию — github.com/modxcms/revolution/pulls
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.