2016-03-09 2 views
0

У меня проблема с именем пользователя и уникальным электронным письмом. Это довольно легко с реляционной базой данных и просто выполняет 2 запроса и возвращает счетчик для каждого.Что дешевле на DynamoDB (GSI против нескольких таблиц)

select count(email) from users; 
select count(username) from users; 

Но в DynamoDB (NoSQL) это лучше (т.е. дешевле) есть 2 таблицы, как так:

username table (where username is the hash) and check that table with a PUT and attribute_does_not_exist 
AND 
email table (where email is the hash) and check that table after the first one with a PUT and attribute_does_not_exist 

или я

email table (hash) and username (GSI in that table). Then query the GSI first and if it doesn't exist then do a PUT with email and username 

Что лучше (дешевле) ?

ответ

0

Два вопроса, поэтому я рассмотрю их отдельно.

Что дешевле?

Вы можете запустить единую таблицу с одной GSI или двумя таблицами для той же стоимости, если хотите, потому что пропускная способность для GSI предоставляется таким же образом, как и пропускная способность первичной таблицы.

Стоимость не должна быть решающим фактором.

Что лучше?

Факт, что DynamoDB затрудняет наличие вторичного атрибута, сохраняет его уникальность, является сложной проблемой. Из-за асинхронности GSI комбинация HASH или HASH/RANGE для GSI не уникальна. В некоторых случаях это можно использовать.

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


Чтобы объяснить, как вы на самом деле выполнить двойную уникальность, сохраняя при этом точности, вы хотели бы воспользоваться условной записью. Следующий план описывает последовательность шагов, которые гарантируют, что вы сохраните уникальность.

  1. Написать запись в имя пользователя таблицы с условием, что имя пользователя не в таблице, но включают в себя условный флаг установлен в ложь (если не удается писать, мы поруки)
  2. Написать запись в электронной почте таблицу с условием, что электронная почта является нет в таблице (если не удается писать, мы удалить предыдущую запись имени пользователя)
  3. обновить запись имени пользователя, чтобы установить условный флаг истинного

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

+0

Что делать, если 3 не удается? Например, у вас есть имя пользователя = Chris, флаг = false, а затем 2: email = chris @ example.com, username = chris, но 3 никогда не меняет флаг на true – cdub

Смежные вопросы