【问题标题】:DynamoDB: When to use what PK type?DynamoDB:什么时候使用什么 PK 类型?
【发布时间】:2015-04-07 21:30:44
【问题描述】:

我正在尝试阅读有关 DynamoDB 的最佳实践。我看到DynamoDB有两种PK类型:

  1. 哈希键
  2. 哈希和范围键

根据我的阅读,后者似乎与前者相似,但支持对有限列集进行排序和索引。

所以我的问题是为什么只使用没有范围键的哈希键?只有在不查表的情况下才可行吗?

最好有一些关于何时使用什么键类型的通用指南。我已经阅读了几本指南(包括亚马逊自己关于 DynamoDB 的文档),但似乎都没有直接解决这个问题。

谢谢

【问题讨论】:

    标签: primary-key amazon-dynamodb


    【解决方案1】:

    使用哪个键的选择取决于特定场景的用例和数据要求。例如,如果您要存储 User Session 数据,则使用 Range Key 可能没有多大意义,因为每条记录都可以由 GUID 引用并直接访问而无需分组要求.一般来说,一旦你知道了 Session Id,你就可以通过键获得特定的项目查询。另一个示例可能是存储用户帐户或个人资料数据,每个用户都有自己的数据,您很可能会直接访问它(通过用户 ID 或其他内容)。

    但是,如果您要存储 Order Items,则 Range Key 更有意义,因为您可能想要检索按其 Order 分组的项目时间>。

    数据模型而言,Hash Key可以让你从你的表中唯一标识一条记录,Range Key可以可选地用于对通常一起检索的多条记录进行分组和排序。示例:如果您要定义一个聚合来存储 Order Items,则 Order Id 可以是您的 Hash Key,而 OrderItemId 范围键。每当您想从特定的Order 中搜索Order Items 时,您只需通过哈希键(Order Id)进行查询,您就会得到所有的订单项目

    您可以在下面找到使用这两个键的正式定义:

    "Composite Hash Key with Range Key 允许开发者创建一个 主键是两个属性的组合,一个'散列 属性”和“范围属性”。查询复合材料时 key,hash属性需要唯一匹配但是一个范围 可以为范围属性指定操作:例如所有订单 过去 24 小时内来自维尔纳的比赛,或个人参加的所有比赛 过去 24 小时内的玩家。”[VOGELS]

    所以 Range KeyData Model 添加了分组功能,然而,这两个 Key 的使用对 Storage Model:

    "Dynamo 使用一致的散列将其键空间划分为 副本并确保均匀的负载分布。统一的钥匙 分布可以帮助我们实现均匀的负载分布,假设 密钥的访问分布没有高度倾斜。” [DDB-SOSP2007]

    Hash Key不仅可以唯一标识记录,还是保证负载分布的机制。 范围键(使用时)有助于指示将大部分一起检索的记录,因此,也可以针对这种需要优化存储。

    选择正确的键来表示您的数据是您设计过程中最关键的方面之一,它直接影响您的应用程序的性能、规模和成本。


    脚注:

    • 数据模型是我们感知和操作数据的模型。它描述了我们如何与数据库中的数据交互 [FOWLER]。换句话说,它是您抽象数据模型的方式、对实体进行分组的方式、选择作为主键的属性等

    • 存储模型描述了数据库如何在内部存储和操作数据 [FOWLER]。尽管您无法直接控制这一点,但您当然可以通过了解数据库内部的工作方式来优化数据的检索或写入方式。

    【讨论】:

    • 谢谢。你的回答很全面
    • 我又读了一遍。我有一个问题是为什么哈希键用于负载平衡而不是范围键?我的印象是范围键的作用类似于标准基于 SQL 的分片设计中的分布键
    • "Dynamo 使用一致的散列在其副本之间划分其密钥空间并确保均匀的负载分布。假设密钥的访问分布没有高度偏斜,均匀的密钥分布可以帮助我们实现均匀的负载分布。 " [DDB-SOSP2007]
    • Hash Key 用于负载均匀分布,Range Key 用于分组和优化数据检索。
    • 分区会优化负载均衡,DynamoDB 使用一种基于哈希键的算法将不同的项目统一分隔在多个分区上(当需要多个分区时)......这就是为什么你应该选择明智地使用哈希键,因为如果您不断访问其中的一些记录(创建热点),那么将不同分区中的多条记录分开是没有用的。 Range Key 将告知哪些记录是相关的,因此 DynamoDB 可以将它们彼此“靠近”存储以优化检索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2020-03-05
    • 2016-04-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多