2015-08-12 2 views
0

Folks, Учитывая мы должны хранить следующую корзину данные:модель данных DynamoDB вторичного индекс поиск

userID1   ['itemID1','itemID2','itemID3'] 
userID2   ['itemID3','itemID2','itemID7'] 
userID3   ['itemID3','itemID2','itemID1'] 

Нам нужно выполнить следующие запросы:

  • Дайте мне все предметы (которые это список) для конкретного пользователя (легко).
  • Дайте мне всех пользователей, у которых есть itemID3 (именно мой вопрос).

Как бы вы это сделали в DynamoDB?

Вариант 1 имеет только хэш-ключ? т.е.

HashKey(users) cartItems 
    userID1   ['itemID1','itemID2','itemID3'] 
    userID2   ['itemID3','itemID2','itemID7'] 
    userID3   ['itemID3','itemID2','itemID1'] 

Вариант 2, ключи хэша и диапазона?

HashKey(users) RangeKey(cartItems) 
    userID1   ['itemID1','itemID2','itemID3'] 
    userID2   ['itemID3','itemID2','itemID7'] 
    userID3   ['itemID3','itemID2','itemID1'] 

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

Если это решить только имея 2 таблицы? Как бы вы их моделировали?

Спасибо!

ответ

3

Правило 1: Клавиши диапазона в DynamoDB таблице должны быть скаляром, и поэтому тип должен быть строки, номера, булевы или исполняемые файлы. Вы не можете взять список, комплект, или map тип.

Правило 2: Вы не можете (в настоящее время) создать вторичный индекс с вложенным атрибутом. От Improving Data Access with Secondary Indexes in DynamoDB documentation. Это означает, что вы не можете индексировать элементы cartItems, поскольку это не атрибут JSON верхнего уровня. Вам может нужна другая таблица для этого.

Итак, простой ответ на ваш вопрос - это еще один вопрос: как вы используете свои данные?


Если запрос пользователей с помощью ввода элемента (например itemID3 в вашем случае) редко, возможно, Scan операция с filter expression будет работать нормально. Чтобы моделировать свои данные, вы можете использовать идентификатор пользователя как ключ HASH и cartItems в качестве набора строк (SS). Для запросов, вам необходимо предоставить filter expression для Scan подобной операции:

contains(cartItems, :expectedItem) 

и обеспечить значение itemID3 для заполнителя :expectedItem в параметре valueMap.

Если вы часто запускаете много таких запросов, возможно, вы можете создать другую таблицу с идентификатором элемента как ключ HASH и набор пользователей, имеющих этот элемент в качестве атрибута набора строк.В этом случае второй запрос в вашем вопросе оказывается первым запросом в другой таблице.

Помните об этом, вам необходимо сохранить данные в двух таблицах для каждого действия CRUD, которое может быть тривиально с DynamoDB Streams.