这是在 DynamoDB 中创建索引的正确方法吗?
Is this the right approach to index creation in DynamoDB?
我想创建一个应用程序,其中包含带有 ID(在本例中为电子邮件)、他们的 phone 号码和其他重要信息的客户列表。大多数时候,客户 table 将使用客户 ID(他们的电子邮件)进行搜索,但偶尔我希望能够使用他们的 phone 号码进行搜索。基本上我希望应用程序有一个文本字段,您可以在其中键入电子邮件或 phone 号码并能够检索客户端数据。
Client ( ID, PhoneNumber, Name, LastName, etc...)
在研究了DynamoDB之后,我想出了一个解决方案,即为客户端提供一个table,并为具有大量读写吞吐量的id提供一个索引散列键,因为基于此进行查询属性将是最常见的任务。然后,我创建了一个全局二级索引,使用属性 phoneNumber 的键,并为其指定一个低吞吐量的读取和写入数字,因为通过其 phone 数字搜索客户端不会太偶尔了。但是,该应用永远不会使用 phone 数字作为键进行更新,它只会使用 id 作为键进行更新。
这是正确的方法,还是有更好的方法?吞吐量值是否符合我的需要,或者您是否认为二级索引不需要任何写入吞吐量值?思维过程可能有问题吗?
非常感谢!
更新:
假设客户端 table 在主索引上的读取吞吐量为 10,写入吞吐量为 10。这意味着我可以通过执行仅提供主键的 GetItem 操作每秒读取大约 10 个数据包(每个 4KB)。我可以每秒写入 10 个数据包(每个 1KB),方法是执行 PutItem 或更新,我提供主键作为查找要更新的项目的唯一方法。是吗?
现在,对于 GSI,如果我在全局二级索引上假设读取吞吐量为 4,写入吞吐量为 4,这是否意味着:我最多可以读取(无限制)4 个包(每个 4KB)每秒通过执行 GetItem 操作,我只提供辅助键作为查找方法。而且由于我对基于辅助键写下或更新任何数据不感兴趣,因为我的应用程序只会 运行 使用其主键更新查询或 putitems,所以我可以将写入吞吐量设置为 0对于 GSI?
或者这些 GSI 写入是否也受到主键操作更改的影响?我知道 phone 数字属性肯定 almost 在创建项目后永远不会改变(除非我自己使用 dynamodb 管理器更改它)或者这很少发生所以我什至可以使写入吞吐量 1.
是的,这正是 DynamoDB 的使用方法。
基本 table 模式可以是一个带有电子邮件地址但没有范围键的散列键。
您可以使用 phone 数字属性作为散列键提供全球二级索引 (GSI)。 GSI 的配置级别不必与基础 table 匹配,但您应该配置写入以说明每次将项目写入基础 table 时,项目(或部分)项目的)也将写入 GSI。如果 GSI 供应不足,可能会导致基础 table.
意外节流
此外,请注意此架构不强制 phone 号码唯一性。 GSI 可以有重复的哈希键值,因此当您查询 GSI 时,您可能会得到多个结果。
以下是有关全球二级索引的一些一般文档:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html
更新:每次写入基础 table,如果出现在 GSI 架构中的属性出现在项目中,它将被写入 GSI。 GSI 实际上只是服务为您维护的第二个 DynamoDB table - 如果 most/all 项目将包含 phone 数字,它需要与基础 table 相同的写入吞吐量。
唯一对 GSI 有效的操作是查询和扫描。要通过 phone 编号检索项目,您可以使用查询 API,条件是散列键等于您要查找的那个。
在单独配置GSI方面,GSI可以拥有完全独立于base的Read Capacity table。例如:
Base table 配备了 10 个 RCU 和 10 个 WCU
GSI 配备了 1 个 RCU 和 10 个 WCU。
我想创建一个应用程序,其中包含带有 ID(在本例中为电子邮件)、他们的 phone 号码和其他重要信息的客户列表。大多数时候,客户 table 将使用客户 ID(他们的电子邮件)进行搜索,但偶尔我希望能够使用他们的 phone 号码进行搜索。基本上我希望应用程序有一个文本字段,您可以在其中键入电子邮件或 phone 号码并能够检索客户端数据。
Client ( ID, PhoneNumber, Name, LastName, etc...)
在研究了DynamoDB之后,我想出了一个解决方案,即为客户端提供一个table,并为具有大量读写吞吐量的id提供一个索引散列键,因为基于此进行查询属性将是最常见的任务。然后,我创建了一个全局二级索引,使用属性 phoneNumber 的键,并为其指定一个低吞吐量的读取和写入数字,因为通过其 phone 数字搜索客户端不会太偶尔了。但是,该应用永远不会使用 phone 数字作为键进行更新,它只会使用 id 作为键进行更新。
这是正确的方法,还是有更好的方法?吞吐量值是否符合我的需要,或者您是否认为二级索引不需要任何写入吞吐量值?思维过程可能有问题吗?
非常感谢!
更新: 假设客户端 table 在主索引上的读取吞吐量为 10,写入吞吐量为 10。这意味着我可以通过执行仅提供主键的 GetItem 操作每秒读取大约 10 个数据包(每个 4KB)。我可以每秒写入 10 个数据包(每个 1KB),方法是执行 PutItem 或更新,我提供主键作为查找要更新的项目的唯一方法。是吗?
现在,对于 GSI,如果我在全局二级索引上假设读取吞吐量为 4,写入吞吐量为 4,这是否意味着:我最多可以读取(无限制)4 个包(每个 4KB)每秒通过执行 GetItem 操作,我只提供辅助键作为查找方法。而且由于我对基于辅助键写下或更新任何数据不感兴趣,因为我的应用程序只会 运行 使用其主键更新查询或 putitems,所以我可以将写入吞吐量设置为 0对于 GSI?
或者这些 GSI 写入是否也受到主键操作更改的影响?我知道 phone 数字属性肯定 almost 在创建项目后永远不会改变(除非我自己使用 dynamodb 管理器更改它)或者这很少发生所以我什至可以使写入吞吐量 1.
是的,这正是 DynamoDB 的使用方法。
基本 table 模式可以是一个带有电子邮件地址但没有范围键的散列键。
您可以使用 phone 数字属性作为散列键提供全球二级索引 (GSI)。 GSI 的配置级别不必与基础 table 匹配,但您应该配置写入以说明每次将项目写入基础 table 时,项目(或部分)项目的)也将写入 GSI。如果 GSI 供应不足,可能会导致基础 table.
意外节流此外,请注意此架构不强制 phone 号码唯一性。 GSI 可以有重复的哈希键值,因此当您查询 GSI 时,您可能会得到多个结果。
以下是有关全球二级索引的一些一般文档:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html
更新:每次写入基础 table,如果出现在 GSI 架构中的属性出现在项目中,它将被写入 GSI。 GSI 实际上只是服务为您维护的第二个 DynamoDB table - 如果 most/all 项目将包含 phone 数字,它需要与基础 table 相同的写入吞吐量。
唯一对 GSI 有效的操作是查询和扫描。要通过 phone 编号检索项目,您可以使用查询 API,条件是散列键等于您要查找的那个。
在单独配置GSI方面,GSI可以拥有完全独立于base的Read Capacity table。例如:
Base table 配备了 10 个 RCU 和 10 个 WCU
GSI 配备了 1 个 RCU 和 10 个 WCU。