Как правильно хранить факт прочтения новости пользователем?
Всем привет.
Дано: Сайт, Пользователи, Новости :)
У каждой новости пользователь должен нажать кнопку/поставить галочку, что он эту новость прочел. Какое может быть решение, кроме очевидного, хранить пару ID пользователя + ID новости?
Решение не очень нравится тем, что при каждом открытии страницы надо будет делать поиск по таблице новостей и по этой таблице, чтобы найти новости, которые пользователь еще не читал.
Есть и другой вариант, делать таблицу не "прочтенных новостей", а, наоборот, новых новостей. Тогда, при каждом добавлении новости, надо будет записывать в эту таблицу все пользователей системы, чтобы потом, когда пользователь прочтет новость, удалять запись.
Может быть есть гораздо более простое и логичное решение и я его не вижу? :)
Как вариант, поле i_read в пользователе. Там в виде json хранить список id прочитанных. Соответственно при выборке из новостей исключать эти id. Но есть опасения, что будет превышен лимит поля.
На мой взгляд оптимальный вариант, как раз тот, который Вас почему-то смущает. А именно отдельная таблица user_id | news_id
ну, почему он меня смущает, я описал. Хотя это я еще над кешированием не думал. Можно, в принципе, в кеше держать массив id пользователей, которые все новости прочитали. Для таких пользователей не делать поиск. А при добавлении новости обнулять этот массив
Вариант с отдельной таблицей я также поддерживаю, это самый адекватный вариант. Что смущает, большая выборка? Так если ключи есть и все настроено правильно, то работать моментально будет.
надо будет делать поиск по таблице новостей и по этой таблице, чтобы найти новости, которые пользователь еще не читал
Это стандартная практика. Всегда есть зависимые данные, связи таблиц и т.д. Так что это не аргумент. Вы ищите не оптимальный метод, а простой с точки зрения построения запроса. Тогда json, но он совершенно не оптимальный. Если же нужен оптимальный, то он как раз в виде доп таблицы.
Максим Тимофеев: json не будет отличаться. Точно так же надо будет взять список id из json массива и сделать запрос к таблице новостей, чтобы найти новые id
Антон Иванов: так как это таблица пользователя, то у Вас уже, по идее, эти данные и так есть. Но повторюсь, я крайне против json варианта. Это просто как странный вариант. Сюда же могу добавить еще более странный иметь в json с пользователями в таблице новостей или вообще при создании новости делать 2k одинаковых записей у который user_id разный, а потом удалять их. Идиотизмов много )))