Предлагаю данные MultiTV хранить в отдельной таблице (json)

Предлагаю разработчикам рассмотреть возможность хранить данные MultiTV хранить в отдельной таблице. Или сделать опцию — хранить по стараму или в отдельной таблице.
id (int)
tmplvarid (int)
contentid (int)
value (JSON)
данные хранить в формате JSON. Тогда можно будет использовать функции базы данных для работы с json.

7 комментариев

avatar
Если вы изучите MultiTV то поймете что это уже реализовано :)
avatar
Вернее просто хранение в другой таблице с возможностью поиска и т д )
а то что вы предлагаете легко реазизуется небольшой надстройкой на сохранение документа :)
avatar
Да, можно самостоятельно сделать надстройку. Но мне кажется будет лучше если такая возможность будет из коробки. Сейчас базы данных умеют работать с форматом JSON и с каждым релизом они это делают лучше и скорость уже не просидает (сильно).
avatar
MultiTV в отдельной таблице если мне не изменяет память — как минимум с EVO 1.4
Чем лучше именно json — ТС, можете пояснить?
То, что новые БД умеют этот формат — совсем не повод все тут же бросаться переделывать — куча старых уже работающих доработок заточена на существующее положение дел?
  • w3d
  • 0
avatar
Тип данных JSON в базе данных появился не так уж и давно. (Имеено как тип данных JSON, а не строка json) И появились инструменты для работы с json прямо в базе данных.
Что это дает — более быструю выборку документов. Например у вас есть 10 тыс товаров и к каждому товару вы привязали какой нибудь multiTV параметр. Потом было принято решение что-бы этот multiTV параметр участвовал в фильтре (выборке\сортировке). Если данные хранятся как просто строка json — то надо будет перебрать все 10 тысяч документов (TV параметров) и обработать их PHP кодом. Если тип данных JSON то можно изловчиться и эту работу переложить на сервер базы данных (Это он делает хорошо в большинстве случаев).
Или другой пример — есть MultiTV параметр с картинкой и описанием, у каких-то документов картинки не заполенены. Надо получить список с картинками/без картинок. Опять-же надо перебрать все документы и обработать PHP кодом или возложить эту работу на базу данных.
Комментарий отредактирован 2018-07-16 09:54:55 пользователем Redduck
avatar
перебрать все документы и обработать PHP кодом

Можно использовать предикаты LIKE и RLIKE в запросе к БД. Вот парочка простых примеров:

<?php
//1. Хотим получить документы в которых ЗАПОЛНЕНЫ ВСЕ ПОЛЯ image в MultiTV
/*
$where='tmplvarid=52 AND value LIKE "%\"fieldValue\":%" AND value NOT LIKE "%\"image\":\"\"%"';
*/
	
//2. Хотим получить документы в которых ЗАПОЛНЕНО ХОТЯ БЫ ОДНО ПОЛЕ image в MultiTV
/**/
$where='tmplvarid=52 AND value RLIKE "\"image\":\"[^\"]"';
/**/

//выполняем запрос
$res=$modx->db->select('contentid,value',$modx->getFullTableName('site_tmplvar_contentvalues'),$where);
if($res){
	//выводим результаты
	while($row=$modx->db->getRow($res)){
		echo $row['contentid'].' - '.$modx->getDocument($row['contentid'],'pagetitle')['pagetitle'].'
';
		echo $row['value'].'

';
	}
}
avatar
Да, конечно можно применять разные приемы. Но тип данных JSON в базе данных для того и придуман что-бы облегчить жизнь программистам. В фреймворке Laravel версии 5.2.23 или выше есть возможность работать с типом данных JSON из коробки. А учитывая что началась работа над EVO 2 (перенос функционала Eloquent ORM) можно предположить что и возможность свободно использовать конструктор запросов для формирования запроса в формате JSON тоже будет работать.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.