0

存在如下表所述的数据集。下表中使用的 Sr.no 仅供参考

|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返回字段tis,b.id,id_type2参考sr.no=1
  2. 输入id和如果data-typeb-type返回字段var_2引用sr.no=2
  3. 输入返回id_type2字段id,tis,b.idsr.no=1,3
  4. 输入data-type返回id基于tis between 12345 and 12347

笔记

  • sr.no=1,3a-type数据每天插入 100k 次,具有唯一性id
  • sr.no=2or b-typeof data 是一组固定的数据。

对于这样的数据集,以下关键方法是否有效?是否可以遵循任何其他方法来存储和检索 DynamoDB 中的数据?

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

GSI1=id_type2 and GSI1SK=id照顾查询 3

GSI2=data-type and GSI2SK=tis照顾查询 4

4

2 回答 2

0

这通过以下 insde DynamoDB解决了,但没有创建任何 GSI。

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

我们做了什么

application_unique_id as hash key
timestamp as sort key

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

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

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

这样我们就知道在哪一天发送了哪些数据(因为 dynamodb 不允许用户导出哈希键列表)。我们可以在 ElasticSearch 中完成所有其余的投影查询和比较查询。

DynamoDB 解决了亚毫秒延迟级别的时间序列数据查询 ElasticSearch 解决了所有对数据进行比较和过滤操作的问题。

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

于 2020-09-17T10:00:08.263 回答
0

以下是我的想法:

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

2)如果数据是一起访问的,那就一起存储——这意味着如果你每次读取某个建模实体的a型数据,你还需要读取同一实体的一个或多个b型记录,这是有利的将所有这些记录放在同一个表中,在同一个分区键下

为了将这一切带回家,在您的示例中,类型 a 和类型 b 数据的 ID 是不同的。这意味着您从在同一个表中存储类型 a 和类型 b 中获得 0 收益。使用两个不同的表。

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

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

于 2019-02-05T20:27:40.763 回答