Размер записи DynamoDB увеличивается со временем - PullRequest
0 голосов
/ 16 октября 2018

У меня есть таблица customer в DynamoDB с базовыми атрибутами, такими как name, dob, zipcode, email и т. Д. Я хочу добавить еще один атрибут, который будет увеличиваться со временем.Например, каждый раз, когда пользователь нажимает на товар (элемент), я хочу добавить его к записи, чтобы у меня был полный снимок профиля клиента в одном значении, индексированном customerId.Итак, мой новый атрибут будет называться viewedItems и будет представлять собой список из itemId просмотров (вместе с отметкой времени).

Однако, учитывая ограничение размера 4 КБ для значения DynamoDB, он собираетсябыть превзойденным со временем, пока я продолжаю добавлять выбранные продукты в профиль клиента.

Как лучше всего определить мои объекты, чтобы выполнить следующее?

  1. Доступ кполный профиль клиента по customerId, включая просмотры.

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

  3. Сканирование всей таблицы с использованием фильтра времени на viewedItems.

  4. Запрос должен бытьПроизводительность, поскольку профиль может быть получен во время запроса.

  5. Возможность обновления отдельной записи клиента (например, с помощью пакетного задания, которое обновляет запись каждого клиента в случае необходимости).

в одну сторонуДля этого нужно создать другую таблицу (скажем, customer_viewed_items) с хеш-ключом customerId и ключом диапазона timestamp со значением, равным itemId, которое просматривал клиент.Но это похоже на усложняющуюся схему - не говоря уже о удвоенной стоимости доступа к элементу.Если мне нужно создать еще один атрибут на основе (скажем) «купленных» предметов, то мне нужно будет создать еще одну таблицу.Таким образом, решение, которое я имею в виду, мне не кажется хорошим.

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

1 Ответ

0 голосов
/ 16 октября 2018

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

Единственное решение - нормализовать вашу базу данных и создать отдельную таблицу, как вы описали.

Теперь следующий вопрос - как минимизировать стоимость поиска в такой схеме?Обычно вам не нужно извлекать все просмотренных элементов, возможно, вы хотите отобразить некоторые из них, тогда вам нужно выбрать только последний X.

Вы можете кэшировать такие элементы в основной таблицеcustomer, т. е. - создайте поле "lastXviewedItems" и обновите его, чтобы оно содержало только ограниченное количество элементов без ограничения размера, конечно же, для анализа BI - вам придется хранить их и во 2-й таблице.

...