在单个 DynamoDB table 上使用多个全局索引是否有效?

Is it efficient to use multiple global indexes on a single DynamoDB table?

存在如下所述的数据集table。 Sr.no以下用table仅供参考

|sr.no|    id    | tis |data-type|   b.id   |idType_2|  var_2 |     
|-----|----------|-----|---------|----------|--------|--------|
|  1  |abc-def-gi|12345|  a-type |1234567890| 843023 | NULL   |
|-----|----------|-----|---------|----------|--------|--------| 
|  2  |1234567890|12346|  b-type |    NULL  |  NULL  |40030230|
|-----|----------|-----|---------|----------|--------|--------|
|  3  |abc-def-gj|12347|  a-type |1234567890| 843023 |  NULL  |

查询类型

  1. 输入 id 如果 data-typea-type return 字段 tis,b.id,id_type2 引用 sr.no=1
  2. 输入 id 如果 data-typeb-type return 字段 var_2 引用 sr.no=2
  3. 输入 id_type2 return 个字段 id,tis,b.id,共 sr.no=1,3
  4. 输入data-typereturnid基于tis between 12345 and 12347

备注

下面的关键方法对这样的数据集有效吗?是否有任何其他方法可以用来从 DynamoDB 存储和检索数据?

Partition Key = id处理查询 1,2。

GSI1=id_type2 and GSI1SK=id 处理查询 3

GSI2=data-type and GSI2SK=tis 处理查询 4 ​​

这是我的想法:

1) 如果您的数据具有不同的访问模式,您应该考虑将数据拆分为不同的 tables

2) 如果一起访问数据,则将其存储在一起——这意味着如果每当您读取某个建模实体的 a 型数据时,您还需要读取一个或多个相同的 b 型记录实体,将所有这些记录放在同一个table、同一个分区键

下是有利的

总而言之,在您的示例中,a 类数据和 b 类数据的 ID 不同。这意味着将类型 a 和类型 b 存储在同一个 table 中将获得 0 个好处。使用两个不同的 tables.

3) 未一起访问的数据根本不会因放在同一个 table 中而受益,事实上在更极端的情况下有可能成为一个问题

关系数据库与非关系数据库之间的主要区别在于,在非关系存储中,您没有交叉 table 连接,因此,关系数据库的原则之一是数据规范化,而相反的趋势是非关系型也是如此。

这已由以下 insde DynamoDB 解决,无需创建任何 GSI。

创建 GSI 时,写入主 table 中的任何数据都会复制到 GSI table 中,因此 WriteCost 是 x GSI 的数量。如果您有 1 个 GSI,则为 PrimaryWrite+GSIWrite;如果您有 2 个 GSI,则为 Primary + GSI1 + GSI2。此外,写入 GSI 与主节点相同,因此如果您以 1000 WCU 写入主节点,同样适用于 GSI,因此 1GSI 总共有 2000 WCU,2 GSI 有 3000WCU。

我们做了什么

application_unique_id as hash key
timestamp as sort key

其余键存储为属性(DynamoDB 支持动态 JSON,前提是存在有效的哈希键和排序键)。

我们使用附加到 table 的 DynamoDB Stream 的 Lambda 函数将数据写入 ElasticSearch 集群。

我们为最新的快照数据制作了每日索引,因为 DynamoDB 拥有所有跟踪点,是保存和查询这些跟踪点的最佳位置。

这样我们就知道在哪一天发送了什么数据(因为 dynamodb 不允许用户导出 hash-keys 的列表)。我们可以在 ElasticSearch 中完成所有其余的预测和比较查询。

DynamoDB解决了亚毫秒级时序数据查询 ElasticSearch 解决了所有在数据之上的比较和过滤操作的问题。

将 DynamoDB ttl 设置为 30 天,ElasticSearch 不支持 ttl,但是一旦索引创建日期超过 30 天,我们就会删除每日索引。