1

我刚刚发现了我在创建 dynamodb 结构时犯的一个大错误。我创建了 11 个表,其中一个是最常被引用的表,其他是补充表。例如,我有一个表,其中包含名为“Names”的名称(连同其他信息)和另一个名为“NamesMappings”的表,其中包含添加到“Names”表中的所有这些名称,以便每次用户想要添加名称时在“Names”表中,他首先尝试将名称放入“NamesMappings”中,并且只有在成功(因此该名称不存在)时,他才能将该名称添加到“Names”表中。如果名称不是唯一的并且不是“名称”表中的主键,则此过程会有所帮助,并且使用此技术我不必在“名称”中搜索

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

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

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

4

1 回答 1

1

如果我正确理解您的问题,您将错过 NoSQL 数据库的整个概念。

您的Names表应该有一个哈希键(类似于主键),它具有统一生成的标识符(UUID 是一个很好的候选者)。这将自动使此表可通过此唯一标识符进行查询。但是,您说您不知道 ID,而只知道名称。这使我认为您可以在表内的属性上创建一个全局二级索引 (GSI) ,以便您也可以通过. 到目前为止,您的表结构应如下所示:NameNamesName

id | name

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

现在,假设您要添加NameMapping属性(我不知道它看起来如何),您可以简单地将其添加到Names表格下,摆脱NamesMappings表格,大大减少您帐户中的 WCU 和 RCU 数量。您的表结构现在应如下所示:

id | name | mappings

mappings比方说,一个 JSON 对象在哪里。

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

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

于 2019-04-16T07:49:16.540 回答