1

我正在构建一个包含通知消息的 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-0800278”, message": "Bob 推荐了一本好书。", "type": "recommended", "isbn": "1844134016" }

这些是表上定义的哈希/范围键:

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 提取通知。

我知道这不能用我选择的 Hash/Range 键来完成。本地二级索引在这里似乎也无济于事,因为我不想在表选择的 HashKey 中工作。

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

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

4

1 回答 1

1

你的分析是正确的。对于案例 3 和此模式,您必须执行表扫描。

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

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

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

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

于 2013-08-29T19:17:09.710 回答