Amazon web services 什么';在DynamoDB中构造用户表的最佳方法是什么?

Amazon web services 什么';在DynamoDB中构造用户表的最佳方法是什么?,amazon-web-services,nosql,amazon-dynamodb,Amazon Web Services,Nosql,Amazon Dynamodb,我正试图建立一个用户表,了解如何在DynamoDB中建模数据 首先,我有两种基本的访问模式 通过id获取用户 通过电子邮件获取用户 但我希望保持表的灵活性,以便以后可以为用户存储其他登录方法,并在以后访问这些方法 下表有意义吗 它允许我通过电子邮件pk:user,sk:user#123,sk:user和gsi上的getItem在主表上创建一个getItem#joe@gmail.com 我担心gsi无法有效地对数据进行分区 | pk | sk_gsi1pk | gsi1sk

我正试图建立一个用户表,了解如何在DynamoDB中建模数据

首先,我有两种基本的访问模式

  • 通过id获取用户
  • 通过电子邮件获取用户
  • 但我希望保持表的灵活性,以便以后可以为用户存储其他登录方法,并在以后访问这些方法

    下表有意义吗

    它允许我通过电子邮件
    pk:user,sk:user#123,sk:user
    和gsi上的
    getItem
    在主表上创建一个
    getItem
    #joe@gmail.com

    我担心gsi无法有效地对数据进行分区

    | pk       | sk_gsi1pk | gsi1sk                |
    | -------- | --------- | --------------------- |
    | user#123 | USER      | email#joe@gmail.com   |
    | user#456 | USER      | email#sarah@gmail.com |
    | user#789 | USER      | email#bob@gmail.com   |
    
    这里有几件事

  • 您不能在GSI上执行
    getItem
    。您可以查询它,但它不能像表的分区和排序那样保证唯一性
  • 你在那里做的是合理的。我怀疑您是否需要在电子邮件地址前添加
    电子邮件35;
    。如果他们使用的是不同的登录形式,那么无论如何也不会是相同的(例如。joe@gmail.com(乔)。还不清楚您是否需要表上的排序键,除非您希望使用相同的分区键值为用户存储其他记录

  • 用户将是一个非常糟糕的GSI PK。您将立即创建一个热键。现在,如果基表sk是user#email#joe@gmail.com,这就足够独特了,因为GSI的PK和你的应用程序可以将其组合在一起。如果我想通过ID获取用户,我必须查询PK:user#123和sk:beginsWith:user#email。这会比getItem慢吗?@alexedwardjones getItem将是您最快的操作,查询速度可能会慢几毫秒。如果这在你的应用程序中是有意义的,考虑以1的限制执行查询(只返回1响应)。限制为1的GetItem与查询的延迟将相等。