在文档(http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/APISummary.html)中,它指出:
您只能查询主键为散列和范围类型的表
和
我们建议您设计应用程序,以便主要使用"查询"操作,并在适当的位置使用"扫描"
它没有直接说明,但这是否最好使用哈希和范围主键?
编辑:
回答TL; DR:使用对您的数据模型有意义的主键类型,并使用二级索引来更好地查询支持.
参考文献:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html
http://www.allthingsdistributed.com/2013/12/dynamodb-global-secondary-indexes.html
bsd*_*bsd 13
选择使用哪个密钥取决于特定方案的用例和数据要求.例如,如果您正在存储用户会话数据,则使用范围键可能没有多大意义,因为每个记录都可以由GUID引用并直接访问而无需分组要求.一般而言,一旦您知道会话ID,您就会获得通过密钥查询的特定项目.另一个示例可能是存储用户帐户或个人资料数据,每个用户都有自己的用户,您很可能会直接访问它(通过用户ID或其他内容).
但是,如果您要存储订单商品,那么范围键更有意义,因为您可能想要检索按订单分组的商品.
就数据模型而言,哈希键允许您从表中唯一标识记录,并且可以选择使用范围键对通常一起检索的多个记录进行分组和排序.示例:如果要定义聚合以存储订单项,则订单ID可以是您的Hash密钥,OrderItemId是Range Key.每当您想要从特定订单中搜索订单商品时,您只需通过哈希键(订单ID)进行查询,您将获得所有订单商品.
您可以在下面找到使用这两个键的正式定义:
"带有范围键的复合哈希键允许开发人员创建一个主键,它是两个属性的组合,一个'哈希属性'和一个'范围属性'.在查询复合键时,哈希属性需要唯一匹配,但可以为范围属性指定范围操作:例如,过去24小时内来自Werner的所有订单,或过去24中个别玩家所玩的所有游戏小时." [VOGELS]
因此,Range Key为数据模型添加了分组功能,但是,使用这两个密钥也会对存储模型产生影响:
"Dynamo使用一致的散列来在其副本上划分其密钥空间,并确保均匀的负载分配.统一的密钥分发可以帮助我们实现统一的负载分配,假设密钥的访问分配不是高度倾斜的." [DDB-SOSP2007]
不仅Hash Key允许唯一标识记录,而且还是确保负载分配的机制.该范围重点(使用时)有助于表明,将主要检索在一起,因此,存储也可以这样需要优化的记录.
选择正确的密钥来表示您的数据是设计过程中最关键的方面之一,它直接影响您的应用程序的性能,规模和成本.
脚注:
数据模型是我们感知和操纵数据的模型.它描述了我们如何与数据库中的数据进行交互[FOWLER].换句话说,就是如何抽象数据模型,将实体分组的方式,您选择作为主键的属性等等.
存储模型描述了数据库如何在内部存储和操作数据[FOWLER].虽然您无法直接控制它,但您可以通过了解数据库内部的工作方式来优化数据的检索或写入方式.
不必要。最好选择一个支持您的用例访问模式的主键。
例如,假设您要有一个Users表。您将存储单个用户的详细信息(姓名,电子邮件,创建者等)。您的访问模式可能是您正在获取特定User的详细信息。在这种情况下,使用hash类型的主键和userId的哈希键更有意义。
假设您还想要另一个存储Groups的表。您的访问模式可能是您想要获取给定组的所有成员。在这里,使用hash和range类型的主键更有意义,您的hash和range键分别是groupId和userId。
要知道的重要事项是两种关键类型(在下面的引号)与表使用准则之间的区别:
哈希类型主键 -主键由一个属性(哈希属性)组成。DynamoDB会在此
主键属性上构建无序哈希索引。表中的每个项目
均由其哈希键值唯一标识。哈希和范围类型主键 -主键由两个属性组成。第一个属性是哈希属性,第二
个属性是范围属性。DynamoDB
在哈希主键属性上构建无序哈希索引,并在
范围主键属性上构建排序范围索引。该表中的每个项目都是
通过其哈希值和范围键值的组合来唯一标识的。两个项目可能具有相同的哈希键值,但是这两个项目必须具有不同的范围键值。
您可以在《 Dynamo数据库使用表指南》文档中查看有关最佳做法的更多信息。
| 归档时间: |
|
| 查看次数: |
15745 次 |
| 最近记录: |