gpt4 book ai didi

amazon-dynamodb - 对于典型的 crud 应用程序,推荐的 dynamo 索引模式是什么?

转载 作者:行者123 更新时间:2023-12-04 10:34:23 25 4
gpt4 key购买 nike

我一直在阅读some DynamoDB index docs他们让我比任何事情都更困惑。让我们用一个具体的例子来澄清一下。

我有一个简单的日历应用程序,其中有一个 events table 。这是我拥有的列:

id: guid,
name: string,
startTimestamp: integer,
calendarId: guid (foreign key in a traditional RDBMS model)
ownerId: guid (foreign key in a traditional RDBMS model)

我想执行以下查询:
  • 通过 ID
  • 获取事件
  • 获取所有事件,其中 calendarId = xownerId = y
  • 获取所有事件,其中 startTimestamp is between x and ycalendarId = z

  • DynamoDB 文档似乎强烈建议避免在此处使用事件 ID 作为分区/排序键,那么推荐的架构是什么?

    最佳答案

    这是每个人在开始使用 DynamoDB 时(实际上在使用过 DynamoDB 时都会遇到的问题)。

    定价和吞吐量

    让我们从 DynamoDB 是如何开始的 priced (它相关 - 老实说)。暂时忽略免费套餐,您需要为静态数据每月每 GB 支付 0.25 美元。您还需要为每个写入容量单位 (WCU) 每月支付 0.47 美元和每个读取容量单位 (RCU) 每月支付 0.09 美元。 Throughput是您 table 上的 WCU 和 RCU 的数量。您必须预先在表上指定吞吐量 - 您可以在表上执行的写入和读取量受吞吐量供应的限制。支付更多的钱,您可以每秒进行更多的读取和写入。有关 DynamoDB 如何分区表的确切详细信息,请参见 this answer .

    key

    现在我们需要考虑表分区。表必须有一个主键。主键必须有一个散列键(又名分区键),并且可以选择有一个排序键(又名范围键)。 DynamoDB 创建 partitions基于您的哈希键值。在分区键值中,数据按范围键排序(如果您已指定)。

    数据访问

    如果您有确切的主键(如果有的话,散列键和范围键),您可以使用 GetItem 立即访问一个项目。 .如果您有多个元素要获取,您可以使用 BatchGetItem .

    DynamoDB 只能通过两种方式“搜索”数据。 Query可以 一次调用只取一个分区的数据 ,因为它使用分区键(以及可选的排序键),所以速度很快。 Scan总是评估表中的每个项目,所以它的 通常很慢并且在大表上不能很好地扩展 .

    吞吐量分布

    这就是变得有趣的地方。 DynamoDB 会占用您购买的所有吞吐量和 evenly spreads it over all of you table partitions .假设您的表上有 10 个 WCU 和 10 个 RCU,以及 5 个分区,这意味着每个分区有 2 个 WCU 和 2 个 RCU。如果您均匀地访问每个分区,那很好,您可以使用所有购买的吞吐量。但想象你 只有永远访问一个分区。现在您已经购买了 10 个 WCU 和 RCU,但您只使用了 2 个。您的表将比您想象的要慢得多。一种选择是购买更多的吞吐量,这会起作用,但对大多数工程师来说可能不是很满意。

    统一访问 v 自然访问

    基于以上我们知道我们想要 design a table where each partition gets accessed evenly .但是,根据我的经验,人们对此过于关注,如果您阅读我刚刚链接的文章(您也链接过),这并不奇怪。

    请记住,分区键是我们在查询中用来快速获取数据并避免常规扫描的内容。有些人过于专注于使他们的分区访问完全统一,最终得到一个他们无法快速查询的表。

    答案

    我喜欢引用Best Practices for Tables guide .尤其是上面写着 的表用户 ID 是一个很好的分区键,只要许多用户定期访问您的应用程序 . (它实际上表示您有很多用户的地方 - 这是不正确的,表的大小无关紧要)。

    它在统一访问和能够为您的应用程序使用直观、自然的查询之间取得平衡,但我要说的是,如果您是 DyanmoDB 的新手,正确的答案可能是基于直观访问来设计您的表。成功完成后,请考虑统一访问和热分区,但请记住,访问不必完全统一。有多种设计模式可以实现直观和统一的访问,但这些对于刚开始的人来说可能很复杂,并且在许多情况下,如果人们过于关注统一访问的想法,可能会阻止他们使用 DynamoDB。

    提示

    大多数应用程序都会有用户。对于大多数查询,在大多数应用程序中,您将执行的最常见查询是获取用户的数据。因此,大多数应用程序的主分区键的第一个选项通常是用户 ID。没关系,只要您没有一些点击率很高的用户和许多从不登录的用户。

    另一个提示。如果您的表称为蔬菜,则您的主分区键可能是蔬菜 ID。如果你的表叫做 shoes,你的主分区键可能是 shoes id。

    大多数应用程序将为每个用户(或蔬菜或鞋子)提供许多项目。主键必须是唯一的。一个不错的选择通常是添加日期范围(排序)键 - 可能是创建项目的日期时间。然后按创建日期对用户分区内的项目进行排序,并为每个项目提供唯一的复合主键(即散列键 + 范围键)。使用生成的 UUID 作为范围键也很好,您不会使用它给您的排序,但是您可以为每个用户拥有多个项目,并且仍然使用 Query 功能。

    索引不是解决方案

    啊哈!但是我可以让我的分区键完全随机,然后使用我真正想要查询的属性的分区键应用索引。这样我就可以获得统一的访问和快速直观的查询。

    可惜不是。索引有自己的吞吐量和分区,独立于建立索引的表。把索引想象成一个全新的表——它们基本上就是这样。 索引不是解决不均匀分区访问的方法。

    最后 - 你的架构

    主键

    哈希键:事件 ID

    范围键:无

    全局二级指数

    哈希键:日历 ID

    范围键:startTimestamp

    假设事件 ID 被统一访问,它将是一个很好的哈希键。您确实需要描述您的数据是如何分布的,以便对此进行更多讨论。其他影响因素是您希望查询工作的速度以及您愿意支付的费用(例如,二级索引很昂贵)。

    还有你的疑问:

    通过 ID 获取事件

    GetItem使用事件 ID

    获取 calendarId = x 和 ownerId = y 的所有事件

    按 GSI 分区键查询,在 ownerId 上添加条件

    获取 startTimestamp 在 x 和 y 之间且 calendarId = z 的所有事件

    按 GSI 分区键查询,在范围键上添加条件

    关于amazon-dynamodb - 对于典型的 crud 应用程序,推荐的 dynamo 索引模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48219867/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com