создавать уникальные идентификаторы для элементов DynamoDB - PullRequest
0 голосов
/ 29 мая 2018

У меня вопрос по поводу DynamoDB , а точнее, как смоделировать таблицу.

Описание проблемы:

Цель : пользователи могут сохранить ценуоповещения о товарах.

Например, : пользователь хочет сохранить оповещение о том, когда цена на товар х меньше целевой цены.

Что я хочуВ частности, сохраняются следующие значения: product, userId, targetPrice, operator .

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

Пользователь может добавить несколько предупреждений для одного и того же продукта, если целевая цена и / или оператор будут отличатьсяЕсли все эти атрибуты одинаковы, то в БД не следует создавать дубликаты.

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

Мой основной " read"Дело в том, чтобы получить все оповещения о продукте.

Мое текущее решение - использовать продукт в качестве первичного ключа (когда я упоминаю продукт, я говорю об уникальном идентификаторе продукта).) и alertId в качестве ключа сортировки.

alertId является составным ключом всех атрибутов: product:userId:targetPrice:operator.

Например, greatBook12:1234:34:lesser.

. Вот пример кода в узле для сохранения предупреждения:

const params = {
  TableName: TABLE_NAME,
  Item: {
    userId,
    alertId: `${product}:${userId}:${targetPrice}:${operator}`,
    product,
    targetPrice,
    operator
  },
  ReturnValues: 'ALL_OLD'
};
docClient.put(params) // ...

Мой вопрос:

Это неправильное использование ключа сортировки.Хотя он охватывает все мои требования (без дубликатов, чтение легко и должно быть относительно быстрым), мне было интересно, если нет лучшего способа сделать это.Может быть, с индексами или чем-то подобным?

Мне нравится плоская структура данных (только элементы в таблице), но, может быть, есть другой способ создания уникальных оповещений для разных targetPrices / операторов / продуктов / пользователей без создания дубликатов?

Итак, я предполагаю, что мой вопрос: есть ли лучший способ сделать это, выполняя требования, с которыми я работаю?

Заранее большое спасибо!

1 Ответ

0 голосов
/ 30 мая 2018

Очень интересный вопрос.С одной стороны, с ключом product вы запрашиваете простоту, но вы также распределяете свои данные неравномерно.Что, если один продукт будет иметь большой успех и займет 50% всей нагрузки (проблема «горячих разделов» подробно описана здесь https://cloudonaut.io/dynamodb-pitfall-limited-throughput-due-to-hot-partitions/)? В этом случае вы, вероятно, столкнетесь с чтением или записью регулирования. DynamoDB советует использовать некоторую случайность(например, случайные значения (1, 1000)), чтобы избежать такого неравномерного распределения. Вы можете узнать больше об этих стратегиях здесь: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-sharding.html#bp-partition-key-sharding-random

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

...