我正在尝试阅读有关DynamoDB的最佳做法。我看到DynamoDB有两种PK类型:
从我读到的内容来看,后者看起来像前者,但支持对有限列的排序和索引。
所以我的问题是为什么只使用没有范围键的哈希键?只有在没有搜索到表格时它才是可行的选择吗?
关于何时使用什么密钥类型,有一些一般性的指导方针也很棒。我已经阅读了几个指南(包括亚马逊自己的DynamoDB文档),但它们似乎都没有直接解决这个问题。
由于
答案 0 :(得分:7)
选择使用哪个密钥取决于特定方案的用例和数据要求。例如,如果您要存储用户会话数据,则使用范围密钥可能没有多大意义,因为每个记录都可以由GUID引用并直接访问而无需分组要求。一般而言,一旦您知道会话ID,您就会获得通过密钥查询的特定项目。另一个示例可能是存储用户帐户或个人资料数据,每个用户都有自己的用户,您很可能会直接访问它(通过用户ID或其他内容)。
但是,如果您要存储订单商品,那么范围键会更有意义,因为您可能想要检索按订单分组的商品。
就数据模型而言,哈希键允许您从表中唯一标识记录,范围键可以可选地用于对通常一起检索的多个记录进行分组和排序。示例:如果要定义聚合以存储订单项,则订单ID 可以是您的哈希键, OrderItemId < / em> 范围键。无论何时您想从特定的订单中搜索订单商品,您只需通过哈希键(订单ID)查询,您将获得所有订单项目
您可以在下面找到使用这两个键的正式定义:
“带有范围键的复合哈希键允许开发人员创建一个 主键是两个属性的组合,一个'哈希 属性'和'范围属性'。查询复合时 key,hash属性需要唯一匹配但是范围 可以为范围属性指定操作:例如所有订单 来自Werner过去24小时,或所有由个人玩的游戏 过去24小时内的玩家。“[VOGELS]
因此 Range Key 为数据模型添加了分组功能,但是,这两个密钥的使用也对存储模型<有影响< / EM>:
“Dynamo使用一致的散列来划分其密钥空间 复制品并确保均匀的负荷分布。统一的钥匙 分布可以帮助我们实现均匀的负荷分配 密钥的访问分配并没有高度倾斜。“ [DDB-SOSP2007]
不仅哈希密钥允许唯一标识记录,而且还是确保负载分配的机制。 Range Key (使用时)有助于指示主要一起检索的记录,因此,存储也可以根据需要进行优化。
选择正确的密钥来表示您的数据是设计过程中最关键的方面之一,它直接影响您的应用程序的性能,规模和成本。
脚注:
数据模型是我们感知和操纵数据的模型。它描述了我们如何与数据库中的数据进行交互[FOWLER]。换句话说,就是你如何抽象你的数据模型,你对实体进行分组的方式,你选择作为主键的属性等等。
存储模型描述了数据库如何在内部存储和操作数据[FOWLER]。虽然您无法直接控制它,但您可以通过了解数据库内部的工作方式来优化数据的检索或写入方式。