Nosql 如何在Dynamodb中设置索引,以便用户可以通过电子邮件或用户名登录

Nosql 如何在Dynamodb中设置索引,以便用户可以通过电子邮件或用户名登录,nosql,amazon-dynamodb,Nosql,Amazon Dynamodb,我正在尝试构建一个拥有用户的DynamoDB解决方案。我选择单表设计,有一系列的关系,我需要适应,但这些可能是无关紧要的这个问题。此表将提供用户身份验证,用户将使用存储在此数据库中的凭据登录 显然,我必须使用索引重载来实现这一点。PK将保存诸如USER_ID_XXXX、NOTE_ID_XXXX之类的值,排序键将根据PK的内容在上下文中变化 用户将具有电子邮件、用户名和密码属性 我正在考虑做如下操作,其中“数据”是所有记录都具有的属性,并且根据PK/SK组合派生的上下文而有所不同: PK:USER

我正在尝试构建一个拥有用户的DynamoDB解决方案。我选择单表设计,有一系列的关系,我需要适应,但这些可能是无关紧要的这个问题。此表将提供用户身份验证,用户将使用存储在此数据库中的凭据登录

显然,我必须使用索引重载来实现这一点。PK将保存诸如USER_ID_XXXX、NOTE_ID_XXXX之类的值,排序键将根据PK的内容在上下文中变化

用户将具有电子邮件、用户名和密码属性

我正在考虑做如下操作,其中“数据”是所有记录都具有的属性,并且根据PK/SK组合派生的上下文而有所不同:

PK:USER\u ID\u XXXX,SK:USERNAME,DATA:james,password:abc 主键:用户ID\u XXXX,主键:电子邮件,数据:james@test.com,密码:abc

然后每次更改用户\u ID\u XXXX的密码时,都会在SK=用户名或电子邮件的记录中更新密码

问题是我不知道如何创建一个只包含SK=用户名或电子邮件的记录的GSI,因此我的GSI会因为每个记录而不必要地膨胀

我想我可以用属性USERNAME代替数据,并为此创建一个GSI。用户名中不能有'@',因此用户名和电子邮件之间不会有冲突,但是我不确定在这个例子中SK使用什么


这里更好的解决方案是什么?如果答案是第二个,我将如何设置SK?

为什么不创建一个带有

  • 主键:用户名
  • GSI:电子邮件
任何任意数据都可以存储为非关键属性。前

{
  username: "james", // Primary key
  email: "james@domain.com", // GSI
  password: "randomhashedpassword",
  ... other non-key attributes
}
当您收到带有电子邮件/用户名的请求时,您可以使用用户名或电子邮件进行查询,然后匹配从输入密码检索到的密码


请注意,GSI不保证唯一性。因此,您还需要避免在注册过程中使用电子邮件的情况。例如,向
james111注册/james@test.com
如果有人已向james注册,则应失败/james@test.com因为电子邮件已被使用。这将确保当您在GSI上查询时,可以保证获得单个值。

为什么不创建一个带有

  • 主键:用户名
  • GSI:电子邮件
任何任意数据都可以存储为非关键属性。前

{
  username: "james", // Primary key
  email: "james@domain.com", // GSI
  password: "randomhashedpassword",
  ... other non-key attributes
}
当您收到带有电子邮件/用户名的请求时,您可以使用用户名或电子邮件进行查询,然后匹配从输入密码检索到的密码

请注意,GSI不保证唯一性。因此,您还需要避免在注册过程中使用电子邮件的情况。例如,向
james111注册/james@test.com
如果有人已向james注册,则应失败/james@test.com因为电子邮件已被使用。这将确保当您在GSI上查询时,可以保证获得单个值