Получить ссылку на страницу сообщения на форуме
На форуме сообщения хранятся в таблице с автоинкрементом "id"...
На каждой странице выводится условно по 10 сообщений. Сообщения могут удаляться модераторами, из-за чего сообщения на страницах смещаются.
Как получать ссылку на сообщение по его id, с совершенно другой страницы, например для ассоциаций как здесь. Ведь можем в поле для ассоциаций хранить только id - потому что номер страницы может меняться. (Ссылки имеют вид URL/.../[номер страницы]).
Например можно по id получить номер страницы вот так:
SELECT COUNT(*) FROM имя_таблицы WHERE id < "id для которого ищем ссылку"
Затем делим на число сообщений на странице, и узнаем на какой странице будет сообщение с нашим id.
Может математики подскажут как сделать что-то наподобие индикатора плотности:
Ident1 = f1(Ident, idDel); numId=f2(Ident, id);
Где f1() - функция вызываемая при удалении сообщений, Ident текущий индикатор плотности, Ident1 - обновленный индикатор плотности.
f2() - функция вызываемая при поиске номера(numId) сообщения, а соответственно и его страницы, по id сообщения для которого ищем страницу.
Естественно эта система должна быть быстрее чем COUNT(*). Такое вообще возможно?
Еще можно сделать страницу редиректа, которая принимает номер сообщения и редиректит пользователя на искомую страницу, так можно избавиться от поиска ссылки для каждой выводимой ассоциации, а искать только для той по которой пользователь кликнет.
Какой способ получения страницы сообщения оптимальный?
Ответы (1 шт):
По моему, Вы сами ответили на Ваш вопрос:
так как на id сообщения нельзя опираться для получения id страницы (так как некоторые из сообщений могут быть удалены), то можно получать id страницы, исходя из кол-ва сообщений с id, меньшим данного.
Этот способ - неплохой, но у него есть пара недостатков: 1) "вы не можете выдать страницу, не используя весь массив предшествующих данных" - то есть, не посчитав кол-во сообщений 2) в зависимости от того, сколько сообщений удалено - номер страницы, на котором лежит конкретное сообщение, может меняться. То есть, ссылка с номером страницы ("заходя на страницу M я хотел увидеть сообщение N"), которая была актуальна вчера, может быть неактуальна сегодня. Удалили какие то собщения "за прошлое время" - номер страницы поменялся.
Я не знаю оптимального способа, но мне приходит в голову способ "отвязаться от номера страницы, оперировать только id сообщения".
Пускать по каждому id сообщения мы показываем страницу, где это конкретное сообщение на самом верху страницы, а под ним - еще 9 других ("не удаленных") сообщений.
Если же id соответсвует удаленному сообщению - то можно этот факт отобразить однйо строкой, а под ним показать уже 10 нормальных, не удаленных сообщений.
При этом способе у сайта будет больше "страниц", но так как все страницы - виртуальные, это может не играть никакой роли.