Задача показать измененные записи
От: vaa  
Дата: 20.02.23 02:18
Оценка:
Задача показать измененные записи, т.е. те записи в которых появились изменения с момента последнего просмотра пользователем.
Вижу хранить айдишники непрочтённых или наоборот прочтенных.
в первом случае можно установить лимит времени, чтобы не копить данные бесконечно(не все пользователи будут просматривать все записи).
во втором я так понимаю придется хранить вечно, хотя быть может записей будет меньше чем в первом случае.
Как думаете что лучше?
✊ В мире нет ничего, кроме движущейся материи.
Re: Задача показать измененные записи
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 20.02.23 03:10
Оценка: +1 -1
vaa> Как думаете что лучше?

У тебя противоречивые требования. С одной стороны ты говоришь о фильтрации по атрибуту "время", с другой стороны у тебя сообщения имеют атрибут "прочтённое" и "непрочтённое".

Так-то можно было бы сделать все изменения в виде отдельных записей, и отображать непрочтёнными те сообщения, к которым имеются изменения позже даты последнего просмотра. Но если дополнительно к этому они помечаются пользователем, то так и надо формулировать в требованиях...
Re: Задача показать измененные записи
От: mike_rs Россия  
Дата: 20.02.23 07:35
Оценка: +3
Здравствуйте, vaa, Вы писали:

vaa>Задача показать измененные записи, т.е. те записи в которых появились изменения с момента последнего просмотра пользователем.

vaa>Вижу хранить айдишники непрочтённых или наоборот прочтенных.

У каждой записи должен быть монотонно возрастающий признак, глобальная ревизия. Ревизия присваивается новой записи и меняется при изменении записи. У каждого пользователя поле, где хранится ревизия последней просмотренной записи. Дальше все тривиально.

upd: ревизия — глобальна для всей базы. Добавление новой записи или изменение существующей инкрементирует глобальную ревизию и сохраняет полученное значение в поле записи.
Отредактировано 20.02.2023 8:46 mike_rs . Предыдущая версия . Еще …
Отредактировано 20.02.2023 8:44 mike_rs . Предыдущая версия .
Re: Задача показать измененные записи
От: MadHuman Россия  
Дата: 20.02.23 07:43
Оценка: +1
Здравствуйте, vaa, Вы писали:

vaa>Задача показать измененные записи, т.е. те записи в которых появились изменения с момента последнего просмотра пользователем.

vaa>Вижу хранить айдишники непрочтённых или наоборот прочтенных.
vaa>в первом случае можно установить лимит времени, чтобы не копить данные бесконечно(не все пользователи будут просматривать все записи).
vaa>во втором я так понимаю придется хранить вечно, хотя быть может записей будет меньше чем в первом случае.
vaa>Как думаете что лучше?
зависит от паттерна работы пользователя.
если он чаще будет все просматривать и соотвественно кол-во непросмотренных сильно меньше общего кол-ва, то лучше хранить информацию об непросмотренных для пользователя.
по мере просмотра — удалять эту информацию.
с лимитом тоже норм идея, чтоб не хранить инфу о непросмотренных слишком долго — по истечении времени удалять её.
Re: Задача показать измененные записи
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.02.23 09:53
Оценка: 3 (1) +2
Здравствуйте, vaa, Вы писали:

vaa>Задача показать измененные записи, т.е. те записи в которых появились изменения с момента последнего просмотра пользователем.

vaa>Вижу хранить айдишники непрочтённых или наоборот прочтенных.
vaa>в первом случае можно установить лимит времени, чтобы не копить данные бесконечно(не все пользователи будут просматривать все записи).
vaa>во втором я так понимаю придется хранить вечно, хотя быть может записей будет меньше чем в первом случае.
vaa>Как думаете что лучше?

Хранить (UserId, RecordId, LastVisit) RecordVisits
При запросе джоин с таблицой записей.
Можно хранить вечно

Можно периодически сохранять (UserId, LastVisit) UserVisits и удалять RecordVisits, где UserVisits.UserId=RecordVisits.UserId и UserVisits.LastVisit>RecordVisits.LastVisit
Re[2]: Задача показать измененные записи
От: rFLY  
Дата: 20.02.23 11:58
Оценка: -2
Здравствуйте, mike_rs, Вы писали:

_>У каждой записи должен быть монотонно возрастающий признак, глобальная ревизия. Ревизия присваивается новой записи и меняется при изменении записи. У каждого пользователя поле, где хранится ревизия последней просмотренной записи. Дальше все тривиально.

Если я правильно понял задачу, то должен быть "справочник", в котором в одной колонке пользователь, во второй ИД записи, в третьей штамп времени просмотра. Вот тогда для каждой записи можно будет определить была ли она просмотрена или нет.
Ниже gandjustas тоже самое предложил, но раньше, так что можно удалить.
Отредактировано 20.02.2023 12:01 rFLY . Предыдущая версия .
Re[3]: Задача показать измененные записи
От: mike_rs Россия  
Дата: 20.02.23 14:56
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>Здравствуйте, mike_rs, Вы писали:


_>>У каждой записи должен быть монотонно возрастающий признак, глобальная ревизия. Ревизия присваивается новой записи и меняется при изменении записи. У каждого пользователя поле, где хранится ревизия последней просмотренной записи. Дальше все тривиально.

FLY>Если я правильно понял задачу, то должен быть "справочник", в котором в одной колонке пользователь, во второй ИД записи, в третьей штамп времени просмотра. Вот тогда для каждой записи можно будет определить была ли она просмотрена или нет.
FLY>Ниже gandjustas тоже самое предложил, но раньше, так что можно удалить.

нет, не так. Нужен глобальный счетчик ревизии, большой. И два поля — в самой записи (меняется при изменении) и у пользователя (хранит текущее значение счетчика в момент просмотра). Тогда все записи с ревизией больше чем у пользователя для него новые. В какой момент обновлять значение у пользователя — например при логофе. Да, тут возможен кейс, что реально он записи то и не посмотрел, зато работает мгновенно и ресурсов не жрет.
Re: Задача показать измененные записи
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.02.23 15:44
Оценка:
Здравствуйте, vaa, Вы писали:
vaa>Как думаете что лучше?
Лучше разобраться, что именно нужно делать.
Все советы в топике упираются в предположение, что пользователь "читает" все записи одновременно.
То есть вот он зашёл, к примеру, впервые. У него все записи показываются как непрочтённые.
Зашёл через день — ему показывают записи, добавленные и изменённые с момента его логоффа.
Несмотря на то, что, может, он вчера прочитал всего десяток — а остальные миллионы так и остались непрочтёнными.

Нужно понять, где хранятся эти записи — на клиенте или на сервере.
Если на клиенте — то можно просто добавить к записям флаг прочитанности пользователем, и всё будет прекрасно. Новые и изменённые записи реплицируются со сброшенным флагом.
Если на сервере — то есть ли возможность хранить на клиенте флаги прочитанности для каждой записи? В принципе, ничего военного — это всего лишь список ID, который можно организовать в компактное и эффективное B-tree.
Если нет — то придётся перейти к паллиативным решениям, основанным на сравнении таймстампов. Для улучшения экпириенса можно рассмотреть перспективу хранения не одного таймстампа на все сообщения, а по таймстампу на "канал" или "топик" — как это сделано в Телеграме.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.