16

我已经构建了一个应用程序,它目前有一个相当标准的用户表,如下所示:

int id, varchar email, varchar 密码

如果我要将其切换到 DynamoDB,那么我将如何创建此表?

如果我对电子邮件地址使用哈希键,那么我将无法提供更新您的电子邮件的能力,如果我使用哈希来存储 ID,那么我需要使用昂贵且受 1Mb 限制。

请问有什么建议吗?谢谢,马克

4

3 回答 3

5

您是否说因为需要按电子邮件字段过滤,所以使用 ID 作为哈希会很昂贵?

如果您需要按非键列过滤查询,通常会结束为它创建索引

DynamoDB没有内置二级索引,但是很容易实现您自己的解决方案。

正如您所指出的,主表可以使用ID作为hash,并且不同的表可以用作索引,它可以是:

varchar email, int id

通过电子邮件发送辅助表的哈希键。如果允许多个用户使用相同的电子邮件,那么您可以使用ID作为范围,以使事情变得更容易,否则一个简单的列将适合。

于 2012-04-19T14:19:25.443 回答
2

使用不同的表进行索引将导致高维护。我从我的前 CTO 那里发现了一个冗余模型。

对于您的表:用户

关系型数据库:

身份证、邮箱密码

1、senthil3569@stack.com,问

动态数据库:

KEY、身份证、邮箱、密码

1, 1, senthil3569@stack.com, 问

senthil3569@stack.com,1 , senthil3569@stack.com, 问

您不是存储一条记录,而是冗余存储以使用非索引列进行获取。

希望解决方案是明确的。

于 2012-04-27T10:10:52.920 回答
1

创建User具有哈希键 id(用户 UUID)和其他属性的表。使用哈希键电子邮件创建全局二级索引,您可以根据需要选择排序键(用户活动状态,用户类型)。

  • 您可以获取它们并在 UUID(user id) 上更新用户
  • 使用 emailId 获取用户
  • 在没有过滤器的情况下获取具有活动状态的用户(在排序键上)
UserTable:
   Type: AWS::DynamoDB::Table
   Properties:
     TableName: UserTable
     AttributeDefinitions:
       - AttributeName: id
         AttributeType: S
       - AttributeName: email
         AttributeType: S
       - AttributeName: status(optional sort key according to your requirement)
         AttributeType: S
     KeySchema:
       - AttributeName: id
         KeyType: HASH
     ProvisionedThroughput:
       ReadCapacityUnits: 5
       WriteCapacityUnits: 5
     GlobalSecondaryIndexes:
       - IndexName: UserDetail
         KeySchema:
           - AttributeName: email
             KeyType: HASH
           - AttributeName: status(option)
             KeyType: RANGE
         Projection:
           ProjectionType: ALL
         ProvisionedThroughput:
           ReadCapacityUnits: 5
           WriteCapacityUnits: 5
于 2019-08-14T09:45:55.360 回答