【问题标题】:Can I use a single DynamoDB table to support these three use cases?我可以使用单个 DynamoDB 表来支持这三个用例吗?
【发布时间】:2013-08-29 02:07:02
【问题描述】:

我正在构建一个包含通知消息的 DynamoDB 表。消息从给定用户 (from_user) 定向到另一个用户 (to_user)。它们很简单:

{ “to_user”:“e17818ae-104e-11e3-a1d7-080027880ca6”,“from_user”:“e204ea36-104e-11e3-9b0b-080027880ca6”,“notification_id”:“e232f73c-104e-11e3-9b30-080026 ", "message": "Bob 推荐了一本好书。", "type": "recommended", "isbn": "1844134016" }

这些是表上定义的 Hash/Range 键:

HashKey:to_user,RangeKey:notification_id

案例 1:用户经常打电话回家询问任何可用的通知。

使用这些键,可以轻松获取等待给定用户的通知:

notifications.query(to_user="e17818ae-104e-11e3-a1d7-080027880ca6")

案例 2:一旦用户看到了一条消息,他们会明确地确认它并删除它。使用给定的 Hash/Range 键同样可以简单地完成:

notifications.delete(to_user="e17818ae-104e-11e3-a1d7-080027880ca6", notification_id="e232f73c-104e-11e3-9b30-080027880ca6")

案例 3:有时可能需要删除此表中由 to_user 和 notification_id 以外的键标识的项目。例如,用户 Bob 决定取消推荐一本书,我们希望使用 from_user=Bob、action=recommended 和 isbn=isbnval 提取通知。

我知道这不能用我选择的哈希/范围键来完成。本地二级索引在这里似乎也没有帮助,因为我不想在表选择的 HashKey 中工作。

那么我是否被困在进行全面扫描?我可以想象创建第二个表以将 from_user+action+isbn 映射回原始表中的项目,但这意味着我必须管理额外的复杂性......而且这个手动索引似乎很容易不同步。

任何见解将不胜感激。我是 DynamoDB 的新手,并试图了解典型数据模型如何映射到它。谢谢。

【问题讨论】:

    标签: nosql amazon-dynamodb


    【解决方案1】:

    您的分析是正确的。对于案例 3 和此架构,您必须进行表扫描。

    您已经确定了许多选项,但所有这些选项都会给您的应用程序增加一层复杂性。

    1. 按照您的说明使用第二个表。您正在有效地创建自己的全局索引,并且必须自己管理这种复杂性。随着您需要更多索引,这会变得越来越复杂。

    2. 执行全表扫描。查看 DynamoDB 的扫描分段,了解一种跨多个工作节点分布扫描的方法。根据您的延迟要求(如果建议在下一次扫描之前不会消失,是否可以?)您可以将这个和其他未来的后台任务组合成一个持续的后台进程。这也比 1 简单。

    这两个似乎都是相当常见的模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多