Уникальность вторичного индекса DynamoDB

Вопрос:

Таблицы DynamoDB с первичным ключом, являющимся составной клавишей хеш-диапазона, уникальны. Это распространяется и на вторичные индексы?

Пример:

У меня есть таблица DynamoDB с post_id и ключом comment_id. Кроме того, существует локальный вторичный индекс с ключом диапазона date-user_id.

Каждая запись представляет собой комментарий, который пользователь оставил на почте. Цель вторичного индекса - подсчитать, сколько уникальных пользователей оставили комментарий к сообщению в определенный день.

Запись 1: post_id: 1 comment_id: 1 date-user_id: 2014_06_24-1

Запись 2: post_id: 1 comment_id: 2 date-user_id: 2014_06_24-1

Запись 3: post_id: 1 comment_id: 3 date-user_id: 2014_06_24-2

Когда я делаю запрос с указанием вторичного индекса и передаю условие post_id равным 1, а date-user_id равно 2014_06_24-1, я получаю счет 2, и я ожидаю подсчет 1.

Почему вторичный индекс имеет две записи с одним и тем же ключом первичного ключа/диапазона.

Ответ 1

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

Глобальный вторичный индекс (GSI) аналогичен LSI в этом аспекте. Каждый элемент GSI содержит хеш таблицы и ключи диапазона (соответствующего элемента). Более подробную информацию можно найти на http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.Projections

Ответ 3

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

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