Amazon dynamodb 可查询的未绑定项目数量

Amazon dynamodb 可查询的未绑定项目数量,amazon-dynamodb,Amazon Dynamodb,我一直在考虑查询未绑定数量项目的可能策略 例如,想象一个论坛——你可以有任意数量的论坛帖子按主题分类。您需要支持至少两种访问模式:帖子详细信息视图和按主题列出的帖子 // legend PK = partition key, SK = sort key 虽然很容易获得一篇文章,但如果不进行扫描,就无法有效地查询文章列表 PK = postId 非常适合查询给定主题的所有帖子,但所有帖子都位于同一分区(“热分区”) 将物品储存在桶中,例如每天新的桶。这会将大量逻辑推送到应用层并增加延迟。例如,

我一直在考虑查询未绑定数量项目的可能策略

例如,想象一个论坛——你可以有任意数量的论坛帖子按主题分类。您需要支持至少两种访问模式:帖子详细信息视图和按主题列出的帖子

// legend
PK = partition key, SK = sort key
虽然很容易获得一篇文章,但如果不进行扫描,就无法有效地查询文章列表

PK = postId
非常适合查询给定主题的所有帖子,但所有帖子都位于同一分区(“热分区”)

将物品储存在桶中,例如每天新的桶。这会将大量逻辑推送到应用层并增加延迟。例如,如果你需要获得10篇文章,你必须查询今天的文章,如果文章少于10篇,则查询昨天的文章,等等。甚至不要让我开始分页。如果它越过桶,那可能是一场噩梦

PK = topic#date and SK = postId#addedDateTime


所以我的问题是如何以“DynamoDB方式”存储和查询未绑定的项列表?

我认为您已经很好地了解了您的选项

我不能自称知道一条真正的路™ 为了解决DynamoDB中的这个特殊问题,为了便于讨论,我将抛出一些想法

虽然很容易获得一篇文章,但如果不进行扫描,就无法有效地查询文章列表

PK = postId
如果您的主键只包含
postId
(我将使用
POST#
使其更易于阅读),则肯定会出现这种情况。那张桌子看起来像这样:

这对于“fetch post details view(aka fetch post by ID)”访问模式来说是非常高效的。但是,我们没有内置任何方式来按主题访问一组帖子。下面让我们来试一试

有几种方法可以模拟帖子和主题之间的一对多关系。首先想到的是在
主题
字段上创建一个二级索引。从逻辑上讲,这看起来是这样的:

现在我们可以通过高效的<代码>查询>代码>操作来获取一个项目的帖子集合。如果每个主题的帖子数量越来越大,分页将有助于您。这可能对您的应用程序足够了。为了这个讨论,假设它创建了一个热分区,并考虑我们可以引入哪些策略来减少。这就是问题所在

一个选项

你说

将物品储存在桶中,例如每天新的桶

这是一个好主意!让我们将次要索引分区键更新为
#
,这样我们就可以在给定的时间范围内(天/周/月/等)按主题对帖子进行分组

我在这里做了几件事:

  • 引入了两个新属性来表示二级索引PK和SK(分别为GSIPK和GSISK)
  • 在分区键中引入了一个截断的时间戳来表示给定的月份。例如,
    POST#1
    POST#2
    都在9月份的时间戳处发布了一个
    POST#u。我将这两个时间戳都截断为
    2020-09-01
    ,以表示整个9月份(或对您的应用程序有意义的任何时间界限)
  • 这将有助于跨分区分发数据,减少热键问题。正如您正确指出的那样,这将增加应用程序逻辑的复杂性,并增加延迟,因为您可能需要发出多个请求才能检索到满足应用程序需要的足够结果。但是,这可能是此si中的一个合理权衡假设。如果延迟增加是一个问题,您可以预先填充一个分区,以包含前N个月主题讨论的结果(例如,
    PK=topic\u CACHE\
    ,具有包含前N个月帖子列表的列表属性)

    如果
    TOPIC\u CACHE
    最终成为热分区,则始终可以使用计算后缀对分区进行切分:

    在检索主题缓存时,应用程序可以随机选择介于1..N之间的主题缓存


    有很多方法可以实现这种访问模式,而这些选项只代表了几种可能性。如果是我的应用程序,我会首先使用Post主题作为分区键创建一个二级索引。这是最容易实现的,并且会让我有机会看到我的应用程序访问模式在生产环境。如果热键问题开始成为问题,我会深入研究某种缓存解决方案。

    感谢您确认观看Rick的2-3次演讲是值得的,我现在对NoSQL数据建模有了大致的了解。呵呵。