Выберите список записей на основе разницы во времени? (PgSQL / PHP / Laravel) - PullRequest
0 голосов
/ 01 ноября 2018

Я пишу приложение, которое будет работать в режиме «только чтение» на клиентской БД, поэтому я не могу ничего изменить в структуре БД, но я также не могу быть обвинен в структуре :) И я не уверен, что это должно быть решено на уровне БД или выше ...

У меня есть таблица PostgreSQL events, которую можно упростить до следующего вида:

id UUID PRIMARY KEY
owner_id INT
previous_event_id UUID FOREIGN KEY REFERENCES (id) ON events
created_at TIMESTAMP

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

Теперь я должен извлечь из него отдельные цепочки событий .
Цепочка событий в нашей терминологии - это набор событий, имеющих одинаковый owner_id, они связаны друг с другом previous_event_id, а разница между их created_at отметками времени меньше X minutes.

Я почти уверен, что проверка по очереди на преемника / предка и разницу во времени потребует возрастов и тысяч запросов к БД в секунду. Каков будет лучший способ сделать это? Я вижу следующие сценарии:

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

  2. Получите количество цепочек событий для user_id == A (практически: для конкретных user_id, получите количество событий, которые имеют previous_event_id NULL (что тривиально), ИЛИ, которые имеют created_at отметка времени больше, чем (отметка времени предыдущего события + X), где предыдущее событие указано previous_event_id) .

  3. Получить цепочку событий, начатую событием с id == B (практически: получить все события, которые имеют то же user_id, что и указанное событие, связаны с previous_event_id и имеют created_at разницу меньше, чем X ).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...