DynamoDB数据建模



有一个java BitSet表示用户唯一,我想存储到DynamoDB,以便使用查询,如"给我所有的BitSet从日期X到日期Y与一个具体的键"。

我的第一种方法是使用一个主键来表示我真正想要计数的内容,例如一个动作:"users-who-pay"。然后范围键是日期,最后我将值转换为二进制属性。

但这可能不是一个好方法,因为我将有几个键和很多日期,所以我想知道是否有人推荐我另一种方法。

DynamoDB文档中的一节处理类似的用例。参见利用稀疏索引

利用稀疏索引

对于表中的任何项,如果索引键值存在于项中,DynamoDB只会将相应的项写入全局二级索引。对于全局二级索引,这是索引散列键及其范围键(如果存在)。如果索引键值不是在每个表项中都出现,则称该索引为稀疏索引。

您可以使用稀疏全局二级索引来有效地定位具有不常见属性的表项。要做到这一点,可以利用这样一个事实,即不包含全局二级索引属性的表项根本不会被索引。例如,在GameScores表中,某些玩家可能在游戏中获得了特定的成就,例如"香槟";——但大多数球员都没有。与其扫描整个GameScores表中的champion,不如创建一个全局二级索引,其中散列键为Champ,范围键为UserId。这将使通过查询索引而不是扫描表来查找所有Champs变得容易。

这样的查询可能非常高效,因为索引中的项数将明显少于表中的项数。此外,投射到索引中的表属性越少,从索引中消耗的读容量单位就越少。

这个例子听起来很像你的"users-who-pay"。用例唯一的区别是(替换"champ"与"付费用户")。然而,它讨论的是一种情况,在这种情况下,很少有用户是冠军(这就是为什么有"冠军"是可以的;作为哈希键-阅读更多关于好的哈希键在这里- http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html)。这可以通过说你有(比如说)100个champ00, champ01,…, champ99。可以在将条目写入DynamoDB时随机选择其中一个值。

如何使用HashMap<String userId, Integer> ?这样做的好处是:

1-地图的大小将根据需要而定。
2-你可以数多于1。使用BitSet,您只能执行0或1。
3- DynamoDb本地支持映射。

编辑:或者如果你不需要计数多于一个,可以使用HashSet。如果一个userId在HashSet中,那就意味着你成功了。

相关内容

  • 没有找到相关文章

最新更新