这是在DynamoDB中创建索引的正确方法吗?

时间:2015-08-31 07:06:55

标签: amazon-web-services database-design amazon-dynamodb nosql

我想创建一个应用程序,其中包含带有ID的客户端列表(本例中为电子邮件),其电话号码和其他重要信息。大多数情况下,客户端表将使用客户端ID(他们的电子邮件)进行搜索,但有时我希望能够使用他们的电话号码进行搜索。基本上我希望应用程序有一个文本字段,您可以在其中键入电子邮件或电话号码,并能够检索客户端数据。

Client ( ID, PhoneNumber, Name, LastName, etc...)

在研究DynamoDB之后,我想出了一个为客户端提供表的解决方案,并为具有大量读写吞吐量的ID提供索引哈希键,因为基于此属性的查询将是最常见的任务。然后,我创建了一个全局二级索引,其中包含属性phoneNumber的密钥,并且为读取和写入提供了低吞吐量数字,因为通过其电话号码搜索客户端不会太偶然。但是,该应用程序永远不会使用电话号码作为密钥进行更新,它只会使用ID作为密钥进行更新。

这是正确的做法,还是会有更好的事情要做?吞吐量值是否适合我的需求,或者您认为二级索引不需要任何写入吞吐量值?思考过程可能有问题吗?

非常感谢!

更新: 假设客户端表的吞吐量读数为10,主索引的吞吐量写入为10。这意味着我可以通过执行GetItem操作每秒读取大约10个数据包(每个4KB),我只提供主键。我可以通过执行类似PutItem或更新的方式每秒写入10个数据包(每个1KB),其中我提供主键作为查找要更新的项目的唯一方法。是吗?

现在,对于GSI来说,如果我让全局二级索引的读取吞吐量为4,写入吞吐量为4,那就意味着:我可以读取最大值(不限制)通过执行GetItem操作,每秒4个包(每个4KB),其中我只提供辅助密钥作为查找方法。由于我对根据二级密钥写下或更新任何数据不感兴趣,因为我的应用程序只会使用其主键运行更新查询或putitems,那么我可以为GSI设置写入吞吐量为0?

或者这些GSI写入是否受到主键操作更改的影响?我知道确保电话号码属性几乎在项目创建后永远不会改变(除非我自己使用dynamodb管理器进行更改)或者这很少发生,所以我甚至可以进行写入吞吐量1。

1 个答案:

答案 0 :(得分:2)

是的,这正是如何使用DynamoDB。

基表架构可以是包含电子邮件地址且没有范围键的哈希键。

您可以使用电话号码属性设置全局二级索引(GSI)作为哈希键。 GSI的配置级别不必与基表匹配,但是您应该为帐户配置写入事实,即每次将项目写入基表时,项目(或项目的一部分)也将被写入到GSI。如果GSI设置不足,可能会导致基表的意外限制。

此外,请注意此架构不会强制执行电话号码唯一性。 GSI可以具有重复的散列键值,因此当您查询GSI时,您可能会收到多个结果。

以下是全球二级索引的一般文档:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html

更新:每次写入基表时,如果项目中存在GSI模式中出现的属性,它将被写入GSI。 GSI实际上只是该服务为您维护的第二个DynamoDB表 - 如果大多数/所有项目都包含电话号码,它需要与基表相同的写入吞吐量。

对GSI有效的唯一操作是查询和扫描。要通过电话号码检索项目,您可以使用查询API,其条件是哈希键等于您要查找的哈希键。

在单独配置GSI方面,GSI可以具有完全独立于基表的读取容量。例如:

基表配置有10个RCU和10个WCU

GSI配置了1个RCU和10个WCU。