Есть таблица MESSAGE, у неё есть поля M_ID, M_PARENT_ID - ссылается на другое сообщение в этой-же таблице
Есть задача - во время отображения web-страницы выбираются все сообщения для которых M_PARENT_ID = данному ID, и для каждого такого сообщеня надо узнать количество его потомков. Я просто добавил поле M_CHILDS_COUNT, при добавлении\удалении потомка соотв. модифицировал это поле и всё было прекрасно. Но сейчас в таблице появились права доступа на каждое сообщение и пользователь может смотреть только те сообщения, для которых MESSAGE.M_ACCESS_VIEW <= данный статус. Соответственно поле M_CHILDS_COUNT не всегда показывает правильное количество сообщений, которые может увидеть данный пользователь. Другой выход - делать так: сначала выбираем все нужные сообщения, потом для каждого сообщения делаем SELECT COUNT(*) FROM MESSAGE WHERE M_PARENT_ID = $id AND M_ACCESS_VIEW <= $status. Всё будет работать правильно, но в данном случае я выполняю не один запрос а N+1 запросов, и меня очень беспокоит производительность.
Я выписал плюсы и минусы каждого подхода, прокомментируйте пожалуйста, если я в чём-то не прав, или, может быть, есть другой вариант?
Использование M_CHILDS_COUNT
Плюсы:
быстрый запрос, например для получения кол-вы сообщений во всех темах при просмотре форума достаточно одного запроса.
Минусы:
В большинстве случаев это поле содержит некорректные данные для конретного пользователя.
Избыточность данных (хотя в данном случае это неявная избыточность, и это не очень плохо).
Дополнительные операции при добавлении\удалении сообщения.
Динамическое вычисление этого значения
Плюсы:
Возможность точного вычисления для конретного пользователя
Минусы:
для каждого сообщения надо делать свой запрос.
(возможно) низкая производительность БД при большом количестве сообщений в базе.
как следствие вышеперечисленного, возможна атака на сайт типа
/message.pl?id=<forum_id>;range=0-999999
^^^^^
думаю, даже не очень много подобных запросов легко перегрузят БД.
как вариант - ограничить макс. кол-во в range, но это плохой вариант.
Используется perl, mysql, у хостера стоит Linux, машина, судя по всему - далеко не мейнфрейм.
Ответ на:
комментарий
от klon
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум [SQL] Структура БД (2010)
- Форум Структура файлов БД. (2017)
- Форум Экспорт структуры бд (2014)
- Форум Выбор структуры БД (2013)
- Форум Zabbix структура БД (2018)
- Форум Обработка структуры БД (2005)
- Форум [sql][бд] Книги (2009)
- Форум Структура БД, union type (2014)
- Форум Подскажите по структуре бд (2013)
- Форум Обновление схемы-структуры БД (2014)