存在下表中描述的数据集。下表中仅提供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 |
查询类型
id
,如果data-type
是a-type
,则返回字段tis,b.id,id_type2
引用sr.no=1
id
,如果data-type
是b-type
,则返回字段var_2
参考sr.no=2
id_type2
的{{1}}返回字段id,tis,b.id
sr.no=1,3
根据data-type
返回id
注意
tis between 12345 and 12347
或sr.no=1,3
数据,并使用唯一的a-type
id
或sr.no=2
数据是一组固定的
数据。以下关键方法对这样的数据集有效吗?还有其他方法可以用来存储和从DynamoDB检索数据吗?
b-type
处理查询1,2。
Partition Key = id
处理查询3
GSI1=id_type2 and GSI1SK=id
处理查询4
答案 0 :(得分:0)
这是我的想法:
1)如果您拥有的数据具有不同的访问模式,则应考虑将数据分成不同的表
2)如果将数据一起访问,则将其存储在一起-这意味着,如果每当您读取某个建模实体的a型数据时,您还需要读取同一实体的一个或多个b型记录,将所有这些记录放在同一分区键下的同一表中
在您的示例中,要想一想起来,类型a和类型b数据的ID是不同的。这意味着将类型a和类型b都存储在同一张表中,您将获得0收益。使用两个不同的表。
3)不能一起访问的数据根本不会从放在同一表中受益,实际上,在更极端的情况下有可能成为问题
关系数据库与非关系数据库之间的主要区别在于,在非关系存储中,您没有跨表联接,因此,关系数据库的宗旨之一是数据规范化,而非关系存储则倾向于相反的情况。关系。
答案 1 :(得分:0)
此问题通过以下方法来创建,即不创建任何GSI的以下实例 DynamoDB 。
创建GSI时,会将写入主表中的所有数据复制到GSI表中,因此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)。
我们使用了连接到表的DynamoDB流上的 Lambda函数,将数据写入ElasticSearch集群。
由于DynamoDB拥有所有跟踪点,并且是保留和查询这些跟踪点的最佳场所,因此我们每天对最新快照数据进行索引。
这样,我们就知道哪一天发送了什么数据(因为dynamodb不允许用户导出哈希键列表)。我们可以在ElasticSearch内完成所有其余的计划查询和比较查询。
DynamoDB解决了亚毫秒级延迟级别的查询时间序列数据 ElasticSearch解决了在数据之上进行所有比较和过滤操作的问题。
将DynamoDB ttl设置为30天,ElasticSearch不支持ttl,但是一旦索引创建日超过30天,我们就会删除每日索引。