DynamoDB - получить N случайных предметов? (Вопрос схемы) - PullRequest
0 голосов
/ 28 октября 2019

Быстрый фон - я хочу хранить каждый возможный 5-значный символ 64 продукта. Итак, AAAAA, Afjsfs, 00ZZ0 и т. Д.

Я хочу иметь возможность произвольно получить 1000 из них, а затем удалить их из БД, чтобы они больше не использовались.

Тривиально генерировать и перемешивать их. Если я сохраню их в СУБД, я мог бы использовать Int-ID auto-inc, первые 1000, а затем удалить записи. Предполагая, что я поместил их в случайном порядке, это полностью работает.

Я хотел бы посмотреть, выполнимо ли это с помощью DynamoDB, или эту проблему лучше оставить на СУРБД.

Я мог бы использовать Int ID в качестве ключа, строку из 5 символов в качестве значения и сделать что-то подобное.

Если я не неправильно понял, я не могу просто взять ключи от ходьбы и взять 1000 записей, могу ли я? Мне нужно предоставить ключ. Это звучит нормально, за исключением того, что теперь я должен поддерживать состояние БД на уровне приложения или представлять другую таблицу, чтобы отслеживать идентификаторы, которые я повторял и удалял.

1 Ответ

0 голосов
/ 28 октября 2019

вы можете сделать следующее:

(1) Каждый элемент будет иметь фиксированный ключ раздела (то есть значение ключа раздела для всех элементов. Точное значение не имеет значения, если оното же самое для всех предметов, поэтому давайте предположим, что это просто строка "foo").

(2) Ключ сортировки будет чем-то случайным, например, случайно сгенерированное 32-битное целое число.

(3) строка из 64 символов из 5 символов будет сохранена в третьем атрибуте(который не является ни разделом, ни ключом сортировки)

, если вы хотите получить 1000 случайных элементов, вам нужно выдать DynamoDB query для ключа раздела = "foo". Элементы, возвращаемые из запроса, сортируются по ключу сортировки. Так как вы выбрали случайный ключ сортировки (см. (2) выше), вы получите 1000 случайных предметов.

соображения сортировки ключа

набор из всех 5 символов base 64 - это пробел размером 2^30. Таким образом, ваш ключ сортировки должен быть достаточно большим, чтобы хранить 2 ^ 30 элементов. Таким образом, прагматичного выбора случайного 32-битного целого будет достаточно. Однако, если вам нужно убедиться, что выбор из 1000 элементов действительно действительно случайный, вы можете выбрать что-то, чья случайность лучше случайной функции вашей среды выполнения. Например, вы можете вычислить sha-384 для значения base 64, которое вы сохраните, и использовать его в качестве значения ключа сортировки. Максимальная длина ключа сортировки составляет 1024 байта , поэтому 384 бита находятся в допустимых пределах.

В частности, не используйте UUID в качестве ключа сортировки. UUID, как правило, не так случайны.

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