Я ищу некоторую ясность вокруг первичных ключей для таблицы DynamoDB, которую уже реализовала моя компания. Таблица состоит из следующих атрибутов:Первичный ключ DynamoDB
WeekStartingOn STRING (represents the Monday of the week the transaction posted)
TransactionID STRING (UUID - unique)
VendorID STRING (UUID - unique by vendor)
dccAmount NUMBER
pointOfSaleTime STRING (Storing UNIX timestamp)
TerminalID NUMBER (UUID)
первичный ключ определение стола:
weekStartingON PRIMARY PARTITION KEY
TransactionID PRIMARY SORT KEY
Текущий GSI-х: vendorIDIndex
VendorID PARITITON KEY
pointOfSaleTime SORT KEY
Образец данных:
Основной тип запроса:
For a vendor, show all the transactions in the past day, week, month, year, etc.
Я считаю, что стоит за нынешней раскладке группировать все сделки на прошлой неделе смежно, а затем оттуда, выберите транзакции поставщика.
Я уверен, что этот дизайн неправильный. Использование weekStartingOn в качестве ключа раздела приведет к горячим клавишам, так как большинство поставщиков захотят посмотреть, например, все, начиная с weekStartingOn = 2016-12-05. Кроме того, сортировка по транзакцииID не имеет никакого смысла. я был бы более склонен иметь первичный ключ базовой таблицы, определенный в соответствии с vendorIDIndex, т.е.
VendorID PARTITION KEY
pointOfSaleTime SORT KEY
Тем не менее, я до сих пор есть несколько проблем с этим дизайном. Некоторые из наших Продавцов намного больше, чем другие, и сделают распределение чтения/записи по разделам несбалансированным. Например, VendorA может иметь 500000 ежедневных транзакций, но VendorB может иметь только 10 ежедневных транзакций. Кроме того, я не совсем уверен, что комбинация VendorID и pointOfSaleTime гарантированно будет уникальной.
Или, чуть более сложным и требует работы для разработчиков:
1 - Randomise the VendorID by adding a suffix, i.e. -1
2 - Depending on the number of suffixes, query the VendorID + Suffix, X amount of times
3 - Merge the results
Я думаю, что я, как последний вариант, но наиболее сложно реализовать, учитывая, где мы сейчас находимся.
Какой был бы лучший дизайн для этого?
Большое спасибо