Два вопроса, поэтому я рассмотрю их отдельно.
Что дешевле?
Вы можете запустить единую таблицу с одной GSI или двумя таблицами для той же стоимости, если хотите, потому что пропускная способность для GSI предоставляется таким же образом, как и пропускная способность первичной таблицы.
Стоимость не должна быть решающим фактором.
Что лучше?
Факт, что DynamoDB затрудняет наличие вторичного атрибута, сохраняет его уникальность, является сложной проблемой. Из-за асинхронности GSI комбинация HASH или HASH/RANGE для GSI не уникальна. В некоторых случаях это можно использовать.
Если вы используете две таблицы, вы берете на себя ответственность за синхронизацию обеих таблиц (что не так просто сделать во многих ситуациях). Это связано с некоторыми важными обязанностями (что произойдет, если ваше приложение умирает после записи в первую таблицу, но до того, как оно будет записано на второй), но эта дополнительная ответственность может позволить вам сохранить уникальность, которую вы хотите.
Чтобы объяснить, как вы на самом деле выполнить двойную уникальность, сохраняя при этом точности, вы хотели бы воспользоваться условной записью. Следующий план описывает последовательность шагов, которые гарантируют, что вы сохраните уникальность.
- Написать запись в имя пользователя таблицы с условием, что имя пользователя не в таблице, но включают в себя условный флаг установлен в ложь (если не удается писать, мы поруки)
- Написать запись в электронной почте таблицу с условием, что электронная почта является нет в таблице (если не удается писать, мы удалить предыдущую запись имени пользователя)
- обновить запись имени пользователя, чтобы установить условный флаг истинного
причину вы хотите использовать условный флаг с именем в по существу указывают на то, что запись не действительна государство должно гарантировать, что вы действительно поддерживаете уникальность.
Что делать, если 3 не удается? Например, у вас есть имя пользователя = Chris, флаг = false, а затем 2: email = chris @ example.com, username = chris, но 3 никогда не меняет флаг на true – cdub