Это как-то хороший вопрос, я никогда не сталкивался с этим раньше, поэтому я мог только предложить вам идею, в которой у меня нет никаких гарантий относительно ее правильности.
Моя идея в основном такова:
Создайте новое поле с именем is_new
в таблице тем. Это поле содержит список значений в виде строки, следуя определенному шаблону. Например: 5|6|12|110|2|45
. Каждое значение между |
представляет идентификатор пользователя, который прочитал тему.
Каждый раз, когда пользователь заходит в форум, выбирая, чтобы вернуть список тем, вы проверяете, читает ли каждая тема этим пользователем, просто:
- Разнесите строку в
is_new
, используя explode('|', $row['is_new']);
- Теперь у вас есть массив, содержащий значения, просто нужно проверить
in_array($user['id'], $list_of_ids);
Если false
, отметьте тему unread
, в противном случае отметьте ее read
, а также обновите идентификатор этого пользователя в списке is_new
.
Этот подход кажется менее «болезненным», чем ваш первоначальный подход, поскольку он проверяет только больше, чем обычно, и одновременно с получением списка тем. Я думаю, что это повлияет немного больше, если у вас есть куча пользователей.
Примечание: вам не нужно беспокоиться о проблеме нормализации, так как is_new
содержит несколько значений, вы используете его только для проверки и обновления, выбор не требуется.
Кроме того, в качестве альтернативы, вы можете проверить темы новые или не используя сравнение времени. Например, если тема длится 4 недели, а пользователь ее не читает, она возвращает старую, даже если она не прочитана (это имеет смысл, не так ли? Как газета). Я думаю, вы сможете сделать это, действительно, довольно просто.
Этот подход особенно часто применяется в некоторых форумах, поскольку он быстр и имеет больше смысла. Помните, что браузеры изначально поддерживают вас при определении прочитанных / непрочитанных тем, т. Е. Цвет гиперссылки на тему будет изменен при ее посещении. Теперь он возвращается к решению Cookies . Я не буду беспокоиться о том, что пользователи удаляют свои куки. Такое случается редко, и пользователи не умирают только потому, что темы read
превращаются в unread
после удаления файлов cookie.
Довольно открытая тема, не правда ли? Надеюсь, это поможет (: