Никогда не показывать один и тот же документ одному и тому же пользователю дважды
У меня есть сервер хранения контента 5000 документов. Допустим, у меня есть 1 миллион пользователей, которые все запрашивают 50 новых документов в своем темпе, пока весь контент не будет просмотрен.
Я хочу убедиться, что каждый пользователь видит и взаимодействует с контентом только один раз и никогда, как Tinder.
Моей первой мыслью было пометить каждый документ списком идентификаторов пользователей, которые видели этот документ. Тем не менее, этот список будет очень длинным... как список из 1 миллиона пользовательских идентификаторов на документ - но это звучит так, как будто это действительно снизит производительность запросов.
У кого-нибудь есть идеи о том, как я могу вернуть контент пользователям только один раз и никогда больше.
PS Я планирую сделать эту сборку с MongoDB
pps Я подумал о том, чтобы составить список "увиденных идентификаторов документов" и прикрепить его к документу пользователя, а затем с каждым запросом, сделанным этим пользователем, "отфильтровывать" результаты, соответствующие "увиденным идентификаторам документов", но с той же проблемой. здесь длина запроса будет расти линейно, так как пользователь продолжает взаимодействовать и вводить новый контент.
2 ответа
Решение зависит от точного значения "в своем темпе".
Ваш второй пост предполагает, что график времени зависит от пользователя, но он будет представлен с документами в порядке, определенном вашим приложением, например, получение новостей в порядке отметки времени создания новостей. В этом случае ваша временная метка или решение с автоинкрементом будут работать, и это окажет лишь небольшое влияние на объем данных и сложность запросов.
Однако, если пользователь может также выбрать, какие документы просматривать, это больше не будет работать, поскольку уже просмотренные документы могут быть разбросаны по всему набору документов. Решение для эффективного решения этой проблемы состоит из двух дизайнерских идей:
(a) Представьте, будет ли большинство пользователей в данный момент времени просматривать небольшую или большую часть всего набора документов. Если ожидается, что только небольшой выбор документов будет представлять интерес для конкретного пользователя, то количество просмотренных пользователем документов будет довольно небольшим. (Например, предположим, что документы касаются ИТ, и один пользователь хочет просматривать только документы MongoDB, а другой, в основном, документы Linux). Если все пользователи будут интересоваться большинством или всеми документами, то количество документов, которое конкретный пользователь не просматривал будет маленьким. (Например, набор новостей, за которыми все пытаются следить.) В зависимости от обстоятельств, сохраняйте только небольшой список просмотренных / не просмотренных идентификаторов документов с каждым пользователем, что также упростит запрос для документов, которые еще предстоит просмотреть.
(b) Для каждого пользователя не хранить список идентификаторов отдельных документов (просмотренных или не просмотренных), а список интервалов таких идентификаторов. Например, если вы храните идентификаторы документов, которые еще не были просмотрены, и некоторые документы добавляются в базу данных, то при открытии пользователя максимальный интервал будет обновляться с (someLowerId, formerHighestId)
в (someLowerId, currentHighestId)
, Когда пользователь просматривает документ, интервал, содержащий его идентификатор, разделяется (lowId, highId)
в (lowId, viewedId - 1), (viewedId + 1, highId)
где один или оба из этих интервалов могут стать пустыми. Включение или исключение таких интервалов также упростит запросы, в отличие от перечисления отдельных идентификаторов.
Мне просто пришла в голову мысль, что я мог бы избежать отношения многие-ко-многим взаимодействия контента с пользователями, если бы я поставил отметку времени на каждом документе, и поэтому запрашивал только больше документов после определенной отметки времени 'ИКС'.
Где "Х" может храниться в моей таблице "пользователей".
Поэтому, открывая приложение, я синхронизировал свою таблицу "пользователи", затем выдавал запросы после отметки времени "X", затем, когда результаты были возвращены, я бы снова обновил таблицу "пользователи" с моей новой отметкой времени X.
Или "x" не может быть отметкой времени, "x" может быть просто автоматически увеличивающимся идентификатором