DynamoDB, принудительное сочетание уникальных полей

У меня есть следующая сущность:

class Terms {
     //hash key
     private String code;

     private String region;
     private String market;
     private String brand;
     private String productType
}

Который сохраняется в таблице Dynamo DB. Мне нужно реализовать ограничение, которое ограничивало бы возможность создания Терминов с одним и тем же region, market, brand and productType, чтобы эта комбинация полей была уникальной. Я новичок в DynamoDB, и первое, что приходит мне в голову, это реализовать это ограничение на уровне приложения, например. реализация функции сервисного уровня, которая проверяет, существует ли уже Term с заданной комбинацией значений полей region = X, market = Y, brand = U, productType = Z, и в случае, если она существует, выдает исключение. Однако мне интересно, есть ли способ реализовать это ограничение на уровне DynamoDB — есть ли способ сделать эту комбинацию полей уникальной на уровне определения таблицы? Любая помощь приветствуется, спасибо, ура


person Andrey Yaskulsky    schedule 21.12.2020    source источник


Ответы (1)


Эта функция не поддерживается в DynamoDB. Кроме того, реализация такой функции не будет масштабируемой в DynamoDB.

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

Есть один вариант, который вы можете рассмотреть. Каждый элемент в DynamoDB должен иметь уникальный первичный ключ. Первичный ключ должен иметь ключ секции и, при необходимости, может иметь ключ сортировки. Если вы создали составной ключ, используя свои поля, и включили их в некоторую комбинацию раздела и ключа сортировки, это эффективно обеспечило бы уникальность. Например, если ключом раздела был код, а ключом сортировки был region+market+brand+producttype. Вам также потребуется какое-то управление версиями, чтобы предотвратить неожиданную перезапись существующих элементов новыми запросами.

person F_SO_K    schedule 22.12.2020
comment
Спасибо за объяснение. Однако один момент для меня все еще не ясен: Насколько я понимаю, DynamoDB обеспечивает уникальность комбинации ключ раздела + ключ сортировки. Если мы возьмем code в качестве ключа раздела и комбинацию region+market+brand+productType в качестве ключа диапазона, то это означает, что у нас могут быть элементы с разными code, но одинаковой комбинацией region+market+brand+productType. Моя цель - сохранить уникальную комбинацию region+market+brand+productType среди всех предметов. Извините, если я пропустил ваше объяснение - person Andrey Yaskulsky; 22.12.2020
comment
Это неправильно. Ключ раздела + ключ сортировки уникальны. - person F_SO_K; 23.12.2020
comment
То есть иметь два элемента: code = x1, region = r1, market = m1, brand = b1, productType = p1 и code = x2, region = r1, market = m1, brand = b1, productType = p1 (кодовые значения разные, другие значения полей идентичны) нельзя? - person Andrey Yaskulsky; 24.12.2020
comment
Я понимаю. В этом случае вы регион+рынок+бренд+тип продукта должны формировать первичный ключ. Имейте в виду, что вместо этого вы можете создать разреженный GSI и запросить его. Таким образом, ваша базовая таблица все еще может иметь код в качестве ключа раздела. docs.aws.amazon.com/ amazondynamodb/latest/developerguide/ - person F_SO_K; 24.12.2020