2015-11-15 2 views
1

Я проектирование таблицы DynamoDB, я следующие атрибуты:Динамо DB данных модели

UniqueID | TimeStamp | Тип: | Контент | флаг

Мне нужно, чтобы получить отсортированный список всех строк на основе временных меток, имеющий флаг установлен в действительность.

uniqueID - это идентификатор системы.
TimeStamp - это системное время во время заполнения таблицы.
число различных типа будет меньше, чем 10.
флаг: истина/ложь

я могу думать о следующих 3 подхода:

  1. Чтобы UniqueID в качестве ключа секционирования для таблицы, и создать Глобальный вторичный индекс как флаг & Классы TimeStamp, Partition and Sort соответственно. Теперь я могу запросить глобальный вторичный индекс с хешем в качестве флага и получить отсортированные элементы на TimeStamp.
    Но проблема здесь в том, что значение флага будет истинным и ложным, а ни один из строк с флагом, установленным в false, относительно очень меньше по сравнению с истинным, будет только 2 раздела. Это теряет все масштабирующие характеристики DynamoDB.

  2. Другой альтернативный вариант делает Type as Partition key и TimeStamp в качестве ключа сортировки для глобального вторичного индекса. Это лучше. Но при запросе я не могу выбрать все типы типа, так как DynamoDB требует ключа Хэш в параметре Query. Поэтому мне нужно запросить этот GSI несколько раз, чтобы получить данные для всех типов хеш-ключа типа.

  3. Сканирование таблицы (Сканирование Эксплуатация): Сканирование возвращает все данные с флагом, установленным в true, без требования хэш-ключа, но это не даст мне отсортированные результаты по созданиюTime.

После анализа прецедента, я думаю, что подход 1 является лучшим на данный момент.

Не могли бы вы предложить какой-либо другой подход лучше, чем это.

Заранее благодарен!

ответ

0

Любой ключ раздела, основанный на флаге или TypeOfInfo, будет плохим, так как существует только несколько возможных значений (соответственно 2 и 10), а также то, как ваши данные попадают в разделы, будут искажены. Вам нужно использовать что-то, что обеспечивает хороший дистрибутив, и в вашем случае базовый кандидат для ключа раздела таблицы уникален.

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

Вы можете попытаться создать GSI с флагом в качестве ключа раздела и временной метки в качестве ключа диапазона. Это не идеальный набор ключей, но охватывает то, что вам нужно. Наличие хорошего ключа для таблицы означает, что позже вы можете легко переключиться на другое решение (например, сканирование и не использовать GSI).Имейте в виду, что если вы хотите избежать запроса таблицы при использовании GSI, вам придется проецировать те атрибуты, которые вы хотите вернуть в GSI.

Итак подводя итог, я думаю, вы можете выбрать между GSI и сканирования:

  • Сканирование может быть медленнее (проверить его), но не требует дополнительного хранения данных
  • GSI может быть быстрее (тест он), но потребует дополнительного хранения данных.
Смежные вопросы