Как настроить индексы, чтобы пользователь мог войти через электронную почту или имя пользователя в Dynamodb - PullRequest
0 голосов
/ 22 октября 2019

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

Я, очевидно, должен использовать перегрузку индекса для достижения этой цели. PK будет содержать значения, такие как USER_ID_XXXX, NOTE_ID_XXXX, и ключ сортировки будет изменяться в зависимости от содержимого PK.

У пользователя будут атрибуты email, имя пользователя и пароль.

Я думалделать что-то вроде следующего, где «данные» - это атрибут, который будет иметь все записи и будет варьироваться в зависимости от контекста, полученного из комбинации PK / SK:

PK: USER_ID_XXXX, SK: USERNAME, DATA: james, пароль: abc PK: USER_ID_XXXX, SK: EMAIL, DATA: james@test.com, пароль: abc

И затем каждый раз, когда пароль изменяется для USER_ID_XXXX, обновляйте его в записях, где SK = USERNAME илиEMAIL.

Проблема в том, что я не знаю, как создать GSI, который будет включать записи только с SK = USERNAME или EMAIL, поэтому мой GSI будет раздутым без необходимости с каждой записью.

Я подумал, что вместо этого я мог бы использовать атрибут USERNAME вместо DATA и создать GSI для этого. Имена пользователей не могут содержать «@», поэтому между именами пользователей и электронными письмами не будет конфликтов, но тогда я не уверен, что в этом случае использовать для SK.

Какое здесь лучшее решение? И если ответ будет вторым, как мне настроить SK?

1 Ответ

1 голос
/ 23 октября 2019

Почему бы не создать таблицу с

  • Первичный ключ: Имя пользователя
  • GSI: Электронная почта

Любые произвольные данные могут быть сохранены как неключевыеатрибутов. Пример.

{
  username: "james", // Primary key
  email: "james@domain.com", // GSI
  password: "randomhashedpassword",
  ... other non-key attributes
}

Когда вы получаете запрос с адресом электронной почты / именем пользователя, вы можете запросить имя пользователя или адрес электронной почты, а затем сопоставить пароль, полученный из входного пароля.

Обратите внимание, что GSI не гарантирует уникальность. Поэтому вам также следует избегать случаев, когда электронная почта уже используется при регистрации. Ex. регистрация на james111/james@test.com должна завершиться неудачей, если кто-то уже зарегистрировался на james/james@test.com, так как электронная почта уже используется. Это гарантирует, что при запросе в GSI вы гарантированно получите одно значение.

...