пользовательский форум php - показ новых / непрочитанных сообщений - PullRequest
9 голосов
/ 16 июня 2011

Я написал собственный скрипт форума, используя php.Я решил не использовать phpbb и другие, так как мне хотелось 100% гибкости в том, что я делал.

Я столкнулся с проблемой:

Как мне показать пользователя, если сообщение новое/ непрочитано или нет.

На ум приходят два решения:

1) Файлы cookie 2) База данных

Я не хочу использовать файлы cookie, поскольку они могут быть удаленыПользователь и сторона Firefox означает, что они автоматически удаляются.В любом случае, я не хочу использовать куки.

База данных вызывает у меня проблему, потому что я не могу разобраться в структуре базы данных в моей голове!Первое решение, которое я мог придумать, было:

  • Когда пользователь загружает форумы, проверьте, когда они в последний раз загружали форумы
  • Проверьте, все ли сообщения были созданы с тех пор, как они загрузились.последние просмотренные форумы
  • Введите эти значения в базу данных в таблице с полями (user_id, post_id).
  • это значение затем удаляется из базы данных при просмотре сообщения

Проблемы, о которых я думаю, это огромная утечка базы данных.Это кажется НАСТОЛЬКО неэффективным.Я уверен, что есть методы с массивами в полях, но я не очень хорош с массивами.

Может ли кто-нибудь дать мне представление о хорошем дизайне базы данных для этого, а также о любом коде, который должен идти вместе с ним?Это сводит меня с ума, так как я просто не могу придумать решение, которое будет хорошим и эффективным с сервером.

Заранее большое спасибо за вашу помощь и помощь,

Джеймс.

Ответы [ 5 ]

11 голосов
/ 16 июня 2011

Это как-то хороший вопрос, я никогда не сталкивался с этим раньше, поэтому я мог только предложить вам идею, в которой у меня нет никаких гарантий относительно ее правильности.

Моя идея в основном такова:

  1. Создайте новое поле с именем is_new в таблице тем. Это поле содержит список значений в виде строки, следуя определенному шаблону. Например: 5|6|12|110|2|45. Каждое значение между | представляет идентификатор пользователя, который прочитал тему.

  2. Каждый раз, когда пользователь заходит в форум, выбирая, чтобы вернуть список тем, вы проверяете, читает ли каждая тема этим пользователем, просто:

    • Разнесите строку в is_new, используя explode('|', $row['is_new']);
    • Теперь у вас есть массив, содержащий значения, просто нужно проверить in_array($user['id'], $list_of_ids);
  3. Если false, отметьте тему unread, в противном случае отметьте ее read, а также обновите идентификатор этого пользователя в списке is_new.

Этот подход кажется менее «болезненным», чем ваш первоначальный подход, поскольку он проверяет только больше, чем обычно, и одновременно с получением списка тем. Я думаю, что это повлияет немного больше, если у вас есть куча пользователей.

Примечание: вам не нужно беспокоиться о проблеме нормализации, так как is_new содержит несколько значений, вы используете его только для проверки и обновления, выбор не требуется.

Кроме того, в качестве альтернативы, вы можете проверить темы новые или не используя сравнение времени. Например, если тема длится 4 недели, а пользователь ее не читает, она возвращает старую, даже если она не прочитана (это имеет смысл, не так ли? Как газета). Я думаю, вы сможете сделать это, действительно, довольно просто.

Этот подход особенно часто применяется в некоторых форумах, поскольку он быстр и имеет больше смысла. Помните, что браузеры изначально поддерживают вас при определении прочитанных / непрочитанных тем, т. Е. Цвет гиперссылки на тему будет изменен при ее посещении. Теперь он возвращается к решению Cookies . Я не буду беспокоиться о том, что пользователи удаляют свои куки. Такое случается редко, и пользователи не умирают только потому, что темы read превращаются в unread после удаления файлов cookie.

Довольно открытая тема, не правда ли? Надеюсь, это поможет (:

5 голосов
/ 16 июня 2011

Многие крупные программы для форумов используют таблицу отслеживания, чтобы следить за тем, кто что прочитал, что-то вроде этого (сильно упрощенное):

CREATE TABLE topic_tracking (
    user_id INT NOT NULL,
    topic_id INT NOT NULL,
    last_visit DATETIME NOT NULL,
    PRIMARY KEY (user_id, topic_id)
)

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

Когда пользователь посещает ветку, обновите эту таблицу отслеживания с помощью отметки времени еговизит.Затем, при отображении ссылок в вашей ветке, проверьте эту таблицу, чтобы увидеть, является ли их last_visit более ранним, чем последнее сообщение в ветке.Это также позволяет показывать «обновленные» темы, а не только «новые».

1 голос
/ 16 июня 2011

Хм, хороший вопрос.

Я брошу свои два цента на то, как я справлюсь с этим, это может быть не самое эффективное решение, но здесь идет речь:

Я бы использовал базу данных для решения этой проблемы.Если возможно, создайте поле в базе данных, которое присоединяется к конкретному пользователю.Внутри этого поля (или столбца или таблицы, если вы предпочитаете) сохраните список «просмотренных» статей по идентификатору статьи.

При отображении страницы для пользователя, получите список «просмотренных» статей и список.из всех доступных идентификаторов статей.

Просмотрите ваш результирующий набор статей / форумов / тем и посмотрите, соответствует ли этот идентификатор любому из "просмотренных" идентификаторов.Для каждой записи статьи / форума / темы, у которой нет соответствующего "просматриваемого" соответствия, для этого пользователя это будет "новая" статья.

Это интенсивный процессор / база данных / сеть и требует просмотра базы данных каждый раз при загрузке страницы, содержащей ссылки на статьи.Хотя с немного продуманным дизайном запросов, я думаю, вы могли бы почти полностью перенести эту операцию в базу данных.

Также другим потенциальным решением, использующим базу данных, было бы то, что когда пользователь впервые заходит на сайт, вы получаете список прочитанных статей / форумов в этой первой точке загрузки и добавляете его в файл cookie или сеанс, этоТаким образом, вы только один раз нажимаете на базу данных для этого списка (при первой загрузке) и сохраняете ее в поле сеанса / файла cookie / скрытого, так что при последующих запросах вам нужно будет только перейти в это поле файла cookie / сеанса / скрытого вместо выполненияDb искать каждый раз, когда пользователь просматривает страницу со списком статей / форумов / тем.Каждый раз, когда пользователь щелкает ссылку, записывает и сохраняет ее в базе данных, а также сохраняет идентификатор статьи / форума в своем поле cookie / сессии / скрытого поля.Еще раз, возможно, не самый эффективный метод, но с некоторым старым добрым умом я уверен, что вы одержите победу.:)

Удачи вам!

H

0 голосов
/ 18 июня 2011

Мой подход заключается в том, чтобы сохранить последний идентификатор записи каждой темы, которую конкретный пользователь видел в базе данных:

user_id   topic_id   post_id
1         2          3

Итак, вы знаете, что пользователь 1 посетил третье сообщение во второй теме, но не смотрел на первую тему вообще.

Чтобы проверить, есть ли у пользователя новые / непрочитанные темы, вы можете сначала проверить значения topic_id, которых нет в этой таблице для этого пользователя.Чтобы проверить, есть ли в новых темах новые сообщения, вы можете сравнить post_id с последним post_id каждой темы.Если они не равны, появляются новые сообщения.

0 голосов
/ 16 июня 2011

Сессия была бы хорошим местом для хранения этого. Я предполагаю, что вы хотите хранить данные только за последние "n" потоков, которые просматривает пользователь, или только за потоки за последние "n" дней.

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

Хотя я думаю, что это отличная возможность для обучения написанию собственного программного обеспечения для форума с точки зрения эффективности его создания, я думаю, что вы несколько изобретаете колесо.

...