DynamoDB吞吐量与搜索时间

问题描述 投票:1回答:1

我刚刚想出了创建dynamodb结构时遇到的一个大错误。我已经创建了11个表,而其中一个表是主要用于表的表,其他表是互补表。例如,我有一个表,其中我保存名称(连同其他信息)称为“名称”和另一个名为“NamesMappings”的表,将所有这些名称添加到“名称”表中,以便每次用户想要添加名称时在“Names”表中,他首先尝试将名称放在“NamesMappings”中,并且只有在成功时(因此该名称不存在),他才能将名称添加到“Names”表中。如果名称不是唯一的并且不是“名称”表中的主键,则此过程会有所帮助,如果名称存在,我不必在“名称”表中搜索,但我可以尝试添加它到“NamesMappings”表,只有成功,我知道这是一个独特的名称。

首先,我想问你这是一种常见的方法,还是有更好的方法?

接下来,我发现通过这种设计,我很快就达到了11个表,每个表有5个预配置的读写能力,这导致在免费层下提供了55个预配置的读写。然后我理解为什么我每个月都会收到所有这些付款,因为随着表的数量越来越大,我将配置的容量保留为默认值(读/写容量都是5)我获得了越来越多的配置容量。

那么,根据这种理解,我的结论应该是什么?我是否应该尝试减少表的数量,即使在表内进行扫描和查询需要花费更多的精力?或者我应该像我一样拆分表,但是减少这些映射表的容量,仅用于指示项目是否存在于另一个表中?

aws-lambda amazon-dynamodb throughput capacity aws-billing
1个回答
1
投票

如果我正确理解你的问题你就会错过NoSQL数据库的整个概念。

你的Names表应该有一个哈希键(类似于主键),它具有统一生成的标识符(UUID是一个很好的候选者)。这将通过此唯一标识符自动使此表可查询。但是,您说,您不知道ID,但您只知道名称。这让我认为你可以在Global Secondary Index (GSI)表中的Name属性上创建一个Names,这样你也可以通过Name查询。到目前为止,您的表结构应如下所示:

id | name

它们都是独立可查询的,这为您提供了很大的灵活性。

现在,假设你要添加NameMapping属性(我不知道它是怎么样的),你可以简单地在Names表下添加它,摆脱NamesMappings表,大大减少了WCU和RCU的数量你的帐户。您的表结构现在应该如下所示:

id | name | mappings

其中mappings就是一个JSON对象。

由于您只能查询DynamoDB中的顶级属性,因此您现在可以对配置了GSI的name属性执行查询。如果查询什么都不返回,那么name是唯一的。但是,假设您仍然需要mappings对象中的一些数据,那么您可以通过name查询,并且在您的代码中,您可以对mappings属性应用map / filter / reduce操作并决定下一步该做什么。

请记住,在NoSQL世界中复制是正常的。如果你来自纯粹的SQL背景,这可能看起来很可怕,但数据应该以这种方式存储在NoSQL数据库中,你应该能够一次性获取所有需要的信息,因此避免“连接”(连接仍然是可能的)在NoSQL数据库中,但由于实体之间没有强关系,因此需要在代码级别手动执行这些连接)。为了给你一些真实的背景,假设你有一个Orders表,你可以跟踪订购的产品和订单所属的商店:你要保存产品和商店对象(而不是它们的ID,因为它会在Order对象内部以SQL方式发生,所以如果你想在将来查询给定的OrderId,你不需要对Product / Store表进行额外的调用(也就是“连接”)来获取信息因为一切都已存储在Order对象中。

© www.soinside.com 2019 - 2024. All rights reserved.