Есть табличка Pages
id | url
1 | /main
Есть табличка BlocksData
id | data | Position_id
1 | {'JSON_OBJECT' : ''} | 1
*data type text
Есть табличка Positions
id | holder
1 | left
Есть связь Pages многие ко многим (табличку связи опустил) BlocksData многие к одному Position
Таблица BlocksData вертикальная разделена для ускорения индексации таблички, так как data type text.
Задача
Произвести рендеринг блоков по позициям (что то на вроде
$this->include('position_plaseholder', $Positions->render('position_plaseholder') )
что выполнит preg_replace в шаблоне с заранее подготовленным кодом лежащим в плейсхолдере). На рендеринг позиции соответственно собираются блоки и им отдается data (в JSON структуре). (Над структурой пока думаю)
Вопроса собственно два, и оба связаны с производительностью, даю варианты или выберите свой
1) Как быстрее:
1.
Select * From Pages JOIN (*многие ко многим*) JOIN BlocksData JOIN Positions WHERE page.url = '$url'
(надеюсь понятно что тут идет упрощение чтобы не расписываться)
2.
Select * From Pages WHERE page.url = '$url';
Select * From Pages_to_BlocksData WHERE page_id in ($page_id)
Select * From BlocksData WHERE id in ($imploded_blocks_id)
Select * From Positions WHERE id in ($imploded_blocksData_id)
второй вариант лучше в лпане красоты кода. легче данные разложить в объекты, а не получать все кучкой как при JOIN. вопрос на сколько это хуже по производительности?
2) Вопрос два связан с вертикальным разделением таблицы BlocksData. опять же как быстрее (производительнее):
1. При получении позиций прихватить JSON структру по пути выборки
а)
Select * From BlocksData JOIN BlocksData_JSON WHERE id in ($imploded_blocks_id)
или
б)
Select * From BlocksData WHERE id in ($imploded_blocks_id)
Select * From BlocksData_JSON WHERE id in ($imploded_blocks_id)
2. При получении позиции вообще не трогать BlocksData_JSON (собственно это медленная таблица с типом данных text) а повесить получение json данных куда то в рендеринг, что породит несколько запросов к бд
Select * From BlocksData_JSON WHERE id in ($blockData_id)
PS пока писал немного запутался. Проект только на стадии планирования планирования=)) и живет только в моей голове пока, так что еще распутаюсь, но эти два вопроса меня интересовали давно.
PPS использовал упрощения для SQL запросов дабы не растягивать. не придирайтесь очень к отсутствию preper query и тп.
PPPS блоков на странице не более 30. а как правило 10-15, нагрузка на сайт средняя (предположим по 10-100 сессий за раз). бд mysql
PPPPS Знаю что JSON в бд хранить плохо, можете об этом не напоминать. думаю в сторону избавиться от него