Получить ссылку на страницу сообщения на форуме

На форуме сообщения хранятся в таблице с автоинкрементом "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 шт):

Автор решения: S.H.

По моему, Вы сами ответили на Ваш вопрос:

так как на id сообщения нельзя опираться для получения id страницы (так как некоторые из сообщений могут быть удалены), то можно получать id страницы, исходя из кол-ва сообщений с id, меньшим данного.

Этот способ - неплохой, но у него есть пара недостатков: 1) "вы не можете выдать страницу, не используя весь массив предшествующих данных" - то есть, не посчитав кол-во сообщений 2) в зависимости от того, сколько сообщений удалено - номер страницы, на котором лежит конкретное сообщение, может меняться. То есть, ссылка с номером страницы ("заходя на страницу M я хотел увидеть сообщение N"), которая была актуальна вчера, может быть неактуальна сегодня. Удалили какие то собщения "за прошлое время" - номер страницы поменялся.

Я не знаю оптимального способа, но мне приходит в голову способ "отвязаться от номера страницы, оперировать только id сообщения".

Пускать по каждому id сообщения мы показываем страницу, где это конкретное сообщение на самом верху страницы, а под ним - еще 9 других ("не удаленных") сообщений.

Если же id соответсвует удаленному сообщению - то можно этот факт отобразить однйо строкой, а под ним показать уже 10 нормальных, не удаленных сообщений.

При этом способе у сайта будет больше "страниц", но так как все страницы - виртуальные, это может не играть никакой роли.

→ Ссылка