Подтвердить что ты не робот

DynamoDB - поместить элемент, если хэш (или хеш-комбинация) не существует

Вот мои варианты использования: у меня есть таблица Dynamo с ключом хэша + диапазона. Когда я помещаю новые элементы в таблицу, я хочу выполнить проверку уникальности. Иногда я хочу гарантировать, что хэш уникален (игнорируя диапазон). В других случаях я хочу разрешить повторяющиеся хэши, но гарантирую, что комбинация хэшей и диапазона уникальна. Как я могу это сделать?

Я экспериментировал с атрибутом_not_exists. Кажется, что он обрабатывает второй случай, когда он проверяет комбинацию хэшей+. Здесь образец PHP:

$client->putItem(array(
    'TableName' => 'test',
    'Item' => array(
        'hash' => array('S' => 'abcdefg'),
        'range' => array('S' => 'some other value'),
        'whatever' => array('N' => 233)
    ),
    'ConditionExpression' => 'attribute_not_exists(hash)'
));

Как ни странно, это не имеет значения, если я использую attribute_not_exists(hash) или attribute_not_exists(range). Оба они, похоже, делают то же самое. Так ли это должно работать?

Любая идея, как обрабатывать случай, когда я хочу только проверить hash на уникальность?

4b9b3361

Ответ 1

Вы не можете. Все элементы в DynamoDB индексируются либо их hash, либо hash + range (в зависимости от вашей таблицы). Один хэш-ключ может иметь несколько клавиш диапазона.

Скажем, например, у вас есть следующие пункты:

  • hash=A,range=1
  • hash=A,range=2

У вас есть 2 возможных результата:

  • Если вы попытаетесь поместить элемент с hash=A,range=3 и attribute_not_exists(hash), вы получите true. Нет элемента с hash=A,range=3, который существует с атрибутом с именем hash. Если вместо этого вы используете attribute_not_exists(range), нет элемента с hash=A,range=3, который существует с атрибутом с именем range, поэтому вы также получите true.

  • Если вы попытаетесь поместить элемент с hash=A,range=1 и attribute_not_exists(hash), вы получите false там элемент с hash=A,range=3, который существует с атрибутом с именем hash. Если вместо этого вы используете attribute_not_exists(range), существует элемент с hash=A,range=3, который существует с атрибутом с именем range.

То, что этот attribute_not_exist эффективно выполняет для обоих из них, является , если элемент не существует.


Подробное объяснение:

  • Каждый элемент имеет как клавиши hash, так и range
  • Вы делаете запрос PutItem и должны предоставлять как hash, так и range
  • Вы предоставляете ConditionExpression с помощью attribute_not_exists на кнопке hash или range

Это означает, что произойдет одна из двух вещей:

  • В базе данных существует пара hash + range.
    • attribute_not_exists(hash) должен быть true
    • attribute_not_exists(range) должен быть true
  • Пара hash + range не существует в базе данных.
    • attribute_not_exists(hash) должен быть false
    • attribute_not_exists(range) должен быть false

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

Ответ 2

Вы можете использовать операцию И, если ваша таблица имеет хеш и диапазон

'УсловиеExpression' = > 'attribute_not_exists (hash) AND attribute_not_exists (range)'