在单个 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 |
查询类型
- 输入
id
如果 data-type
是 a-type
return 字段 tis,b.id,id_type2
引用 sr.no=1
- 输入
id
如果 data-type
是 b-type
return 字段 var_2
引用 sr.no=2
- 输入
id_type2
return 个字段 id,tis,b.id
,共 sr.no=1,3
- 输入
data-type
returnid
基于tis between 12345 and 12347
备注
sr.no=1,3
或 a-type
数据每天插入 100k 次,具有唯一性 id
sr.no=2
或b-type
的数据是一组固定的
数据。
下面的关键方法对这样的数据集有效吗?是否有任何其他方法可以用来从 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 天,我们就会删除每日索引。
存在如下所述的数据集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 |
查询类型
- 输入
id
如果data-type
是a-type
return 字段tis,b.id,id_type2
引用sr.no=1
- 输入
id
如果data-type
是b-type
return 字段var_2
引用sr.no=2
- 输入
id_type2
return 个字段id,tis,b.id
,共sr.no=1,3
- 输入
data-type
returnid
基于tis between 12345 and 12347
备注
sr.no=1,3
或a-type
数据每天插入 100k 次,具有唯一性id
sr.no=2
或b-type
的数据是一组固定的 数据。
下面的关键方法对这样的数据集有效吗?是否有任何其他方法可以用来从 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 天,我们就会删除每日索引。