Запросить последнюю запись для каждого идентификатора в DynamoDB - PullRequest
0 голосов
/ 16 апреля 2020

У нас есть такая таблица:

user_id | video_id | timestamp
      1          2           3
      1          3           4
      1          3           5
      2          1           1

И нам нужно запросить последнюю метку времени для каждого видео, которое просматривается указанным c пользователем.

В настоящее время это делается следующим образом:

response = self.history_table.query(
            KeyConditionExpression=Key('user_id').eq(int(user_id)),
            IndexName='WatchHistoryByTimestamp',
            ScanIndexForward=False,
        )

Он запрашивает все временные метки для всех видео указанного пользователя, но это сильно загружает базу данных, потому что могут быть тысячи временных меток тысяч видео.

Я пытался найти решение для Inte rnet, но, как я вижу, все решения SQL используют GROUP BY, но DynamoDB не имеет таких функций

1 Ответ

1 голос
/ 20 апреля 2020

Я знаю, что это можно сделать двумя способами:

Метод 1 Глобальный вторичный индекс GSI

GroupBy - это своего рода раздел в DynamoDB (но не совсем ). Ваш раздел в настоящее время user_id я предполагаю, но вы хотите video_id в качестве ключа раздела и timestamp в качестве ключа сортировки. Вы можете сделать это, создав новый GSI, и указать новый ключ сортировки timestamp и ключ разделения video_id. Это дает вам возможность запрашивать для данного видео последнюю отметку времени, поскольку этот запрос будет использовать только 1 RCU и будет очень быстрым, просто добавьте --max-items 1 --page-size 1. Но вам нужно будет предоставить video_id.

Метод 2 Разреженный индекс

Проблема с 1 заключается в том, что вам необходимо предоставить идентификатор в то время как вы можете просто хотеть иметь список видео с их последней отметкой времени. Есть несколько способов сделать это, один из способов, которые мне нравятся, это использовать Sparse Index, если у вас есть атрибут с именем latest и для него значение true для последней timestamp, вы можете создать GSI и выбрать ключ атрибута latest, но вам не придется вручную устанавливать и сбрасывать это значение самостоятельно, что вы должны делать в лямбда-потоках или в вашем приложении.

Это кажется странным, но это так * Нет SQL работает в отличие от SQL, с которым я сам сейчас борюсь в текущем проекте, где мне приходится использовать некоторые из этих техник самостоятельно, каждый раз, когда я делаю это, просто не чувствую себя хорошо, но, надеюсь, мы привыкнем к этому.

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