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

Amazon web services 这是在DynamoDB中创建索引的正确方法吗?,amazon-web-services,database-design,amazon-dynamodb,nosql,Amazon Web Services,Database Design,Amazon Dynamodb,Nosql,我想创建一个应用程序,其中包含一个客户列表,其中包含ID(本例中为电子邮件)、电话号码和其他重要信息。大多数情况下,客户表将使用客户id(他们的电子邮件)进行搜索,但偶尔我希望能够使用他们的电话号码进行搜索。基本上,我希望应用程序有一个文本字段,您可以在其中键入电子邮件或电话号码,并能够检索客户端数据 Client ( ID, PhoneNumber, Name, LastName, etc...) 在研究了DynamoDB之后,我提出了一个解决方案,即为客户端提供一个表,并为ids提供一个索

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

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

这是正确的方法,还是有更好的办法?吞吐量值是否基于我的需要而正确,或者您认为二级索引不需要任何写入吞吐量值?思维过程是否有问题

多谢各位

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

现在,对于GSI,如果我在全局二级索引上设置4的读取吞吐量和4的写入吞吐量,这是否意味着:通过执行GetItem操作,我可以每秒读取最多4个包(每个4KB),其中我只提供作为查找方法的辅键。而且,由于我对基于辅助键写入或更新任何数据不感兴趣,因为我的应用程序只会使用其主键运行更新查询或putitems,那么我将能够为GSI设置0的写入吞吐量


或者这些GSI写入是否也受主键操作更改的影响?我知道,可以肯定的是,在创建项目后,电话号码属性几乎永远不会更改(除非我自己使用dynamodb管理器更改它),或者这种情况很少发生,因此我甚至可以将写入吞吐量设为1。

是的,这正是使用dynamodb的方法

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

您可以将电话号码属性设置为哈希键的全局二级索引(GSI)。GSI的设置级别不必与基表匹配,但您应该设置写入,以说明每次将项写入基表时,该项(或该项的一部分)也将写入GSI。如果GSI配置不足,可能会导致基表上出现意外的节流

此外,请注意,此模式不强制电话号码唯一性。GSI可以具有重复的哈希键值,因此当您查询GSI时,可能会返回多个结果

以下是有关全局二级索引的一些常规文档:

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

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

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

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


GSI配备1个RCU和10个WCU。

谢谢您的回答。尽管关于GSI吞吐量值,我在第二部分仍然有点困惑。让我添加一个新的注释,其中包含一个更具体的问题。基于此,您是否建议将电话号码保留在单独的表(命名为phoneNumber)中,phoneNumber作为主键,id(对应于具有给定号码的用户)作为另一个属性,这样我就可以在应用程序搜索期间在phoneNumber表上使用phoneNumber作为键执行getItem,然后在原始表上使用我获得的键执行getItem,从而获得其余属性?这样我就不必对这个表进行太多的写入,也不必对基本表进行节流。GSI是由服务为您管理的第二个DynamoDB表。GSI是基表的最终一致性视图,而如果您自己管理它,它可能具有很强的一致性,但您必须在自己的代码中处理边缘情况。