我正在寻找一些在Dynamodb表设计中创建HashKey和SortKey的建议
我已经创建了表
HashKey - id - date with some interval
sortKey - mainId - date with timestamp
userId - someNumber我的简单代码如下所示
ValueMap valueMap = new ValueMap();
valueMap.put(":pId", pId);
valueMap.put(":mainId", mainId);
StringBuilder userIdList =follwing userIds List;
QuerySpec querySpec = new QuerySpec()
.withProjectionExpression("id,mainId")
.withKeyConditionExpression("id = :pId")
.withFilterExpression("(userId in ("+userIdList+")))
.withValueMap(valueMap).withScanIndexForward(false).withMaxResultSize(minSize);
ItemCollection<QueryOutcome> items = table.query(querySpec);假设我尝试使用id获取数据,并按userId进行过滤。在这种情况下,我的所有读取容量将被使用,因为它通过哈希键读取数据,然后对其应用筛选。因此,在这种情况下,在对数据应用过滤器之后,我没有获得任何记录。
因此,以这种方式,此ItemCollection不返回任何记录,但它读取所有容量(以防userId列表与获取的结果不匹配)
我怎样才能设计出不浪费读容量的表,又怎么修复它呢?
发布于 2017-08-10 20:50:41
您有一个选择就是添加一个[Global Secondary Index][1]。它允许您访问表中的数据,就像您必须对键进行分区一样。
您可以尝试以下两种表模式之一:
HashKey - id -有一定时间间隔的日期
sortKey - mainId -带时间戳的日期
GSI HashKey - userId -用户id (允许通过用户id获取记录)
或者这个:
HashKey - id -有一定时间间隔的日期
sortKey - mainId -带时间戳的日期
GSI HashKey - userId_id -一个属性中的用户id和id (允许获取同时具有id和userId值的记录)
要获取多条记录,可以使用BatchGetItem:
单次操作最多可检索16MB数据,最多可包含100个项目。如果超过响应大小限制、超过表的预置吞吐量或发生内部处理故障,则BatchGetItem将返回部分结果。
https://stackoverflow.com/questions/45607007
复制相似问题