Динамодб с уникальным вторичным / третьим индексом

Я готовлюсь к перестройке базы данных, в которой есть 3 разные таблицы, содержащие одинаковые данные. разница - HashKey для каждого, UserId, UserName, Email. Я пытаюсь объединить их все в одну таблицу, так как считаю избыточность как плохой, так и медленной. Я планирую использовать UserId в качестве HashKey и иметь UserName и Email в качестве вторичных индексов. Я не нашел способа заставить уникальность форсировки DynamoDb для вторичных индексов, поэтому планируйте использовать условные записи, которые проверяют уникальность в них перед записью в базу данных. С SQL это было бы очень легко, есть ли лучший способ сделать это в DynamoDb? Мне нужно иметь возможность искать пользователя на основе любого из трех UserId, UserName и Email. Я хотел бы сохранить это в одной таблице и не использовать другую таблицу, которая ссылается на электронную почту с UserId или UserName на UserId.

1 ответ

Вы правы, что DynamoDB не обеспечивает уникальность глобальных вторичных индексов.

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

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

Так же, как предупреждение: глобальные вторичные индексы в конечном итоге согласованы в DynamoDB. Это означает, что даже если вы получили ответ 200 для PutItem, он может не отображаться сразу, если вы проверите Глобальный вторичный индекс. Это может привести к состоянию гонки, когда вы проверяете одно из значений, и оно еще не распространяется на индекс. У вас возникнет та же проблема, если вы будете поддерживать индекс самостоятельно - вам нужно будет что-то заблокировать, чтобы убедиться, что записи во все три таблицы являются транзакционными.

Другие вопросы по тегам