【问题标题】:What exactly does Hash and Range keys mean in AWS DynamoDb?AWS DynamoDb 中的 Hash 和 Range 键到底是什么意思?
【发布时间】:2020-11-10 06:58:14
【问题描述】:

我是 DynamoDb 的新手,我确实查看了 AWS 文档以及一些关于 Hash 和 Range 键的问题。毕竟,我仍然不确定它们的确切含义以及您为什么/如何使用它们。谁能用一个例子给我一个简单的解释?

例如,如果我想创建一个带有NameGenreRatingDateReleased 列的Movie 表。创建 DynamoDb 表的正确方法是什么。在下面的示例中,我有一些 CloudFormation 来尝试创建以下内容,但我不确定我是否正确使用了 KeySchema 属性。任何帮助将不胜感激。

MovieTable:
    Type: AWS::DynamoDB::Table
    Properties:
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: "Name"
          AttributeType: "S"
        - AttributeName: "Genre"
          AttributeType: "S"
        - AttributeName: "Rating"
          AttributeType: "N"
        - AttributeName: "DateReleased"
          AttributeType: "S"
      KeySchema:
      - AttributeName: "Name"
        KeyType: "HASH"
      - AttributeName: "Genre"
        KeyType: "RANGE"
      - AttributeName: "Rating"
        KeyType: "RANGE"
      - AttributeName: "DateReleased"
        KeyType: "RANGE"
      TimeToLiveSpecification:
        AttributeName: ExpireAfter
        Enabled: false
      SSESpecification:
        SSEEnabled: true

【问题讨论】:

    标签: node.js amazon-web-services amazon-dynamodb amazon-cloudformation


    【解决方案1】:

    有一个非常棒的 DynamoDB 在线资源:DynamoDB, explained.

    来自Anatomy of an Item | DynamoDB, explained

    创建新表时,您需要指定该表的主键。表中的每一项都由其主键唯一标识。因此,写入 DynamoDB 表的每个项目都必须包含主键。

    有两种类型的主键。 简单主键使用单个属性来标识项目,例如用户名或 OrderId。使用带有简单主键的 DynamoDB 表类似于使用大多数简单的键值存储,例如 Memcached。

    复合主键使用两个属性的组合来标识特定项目。第一个属性是分区键(也称为“散列键”),用于跨分片分段和分发项目。第二个属性是排序键(也称为“范围键”),用于对具有相同分区键的项目进行排序。具有复合主键的 DynamoDB 表可以使用简单的 get/set 操作之外的有趣查询模式。

    了解主键是为 DynamoDB 表规划数据模型的关键部分。主键将是您在表中插入和更新项目的主要方法。

    基本上:

    • 分区键(或哈希键)决定了将项目存放在何处。它是一个唯一标识符,可以保证快速访问项目。对于您的 Movies 表,它可以是电影的唯一名称,例如 The Matrix (1999),或者可能是分配给电影的唯一 ID。
    • 排序键(或范围键) 可以选择性地用于扩展分区键以提供“唯一”元素。比如节目可能是The Simpsons,但是有很多集,所以Sort Key可以和Partition Key一起使用,给一个唯一的名字,比如The Simpsons: S02E12

    NoSQL 数据库非常擅长通过主键(或复合键)存储和检索数据。它不擅长“扫描”数据库中的信息,因为这非常低效。因此,如果经常在非主要字段(例如流派)上搜索信息,则创建可以通过其他属性查找项目的附加 次要索引 可能是有利的。见:Secondary Indexes | DynamoDB, explained.

    【讨论】:

      【解决方案2】:

      这里有2个案例

      案例 1:哈希键由唯一标识项目的单个属性组成。

      例如:

      一个。如果你正在设计一个表来存储学生数据,你可以将 HashKey 定义为 Student_Id

      b.如果你正在设计一个表来存储类数据,你可以将 HashKey 定义为 Class_Id

      案例 2:哈希和范围键由两个属性组成,它们共同唯一标识一个项目

      例如:

      一个。如果你正在设计一个表来存储购物车,你可以将HashKey定义为Product_Id,将Range Key(排序键)定义为User_Id。换句话说,Production_Id 和 User_Id 的组合在您的表中必须是唯一的。

      b.如果您正在设计一个表来存储音乐信息,您可以将 HashKey 定义为 Artist 并将 Range Key 定义为“歌曲标题”。换句话说,艺术家和“歌曲标题”的组合在您的表格中必须是唯一的。

      现在,对于您的用例,您可以将 Movie 表定义为

      HashKey:电影标题

      SortKey:发布日期

      类型:属性

      评分:属性

      使用这种设计,这里假设只有 1 个“电影标题”能够在 1 个特定日期发布。换句话说,同一天上映多部同名电影是不可能的。

      希望您现在可以定义 cloudformation。如果没有,请告诉我们,我们会提供帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 2017-08-07
        • 2017-07-20
        • 2014-09-23
        • 2014-07-25
        • 2012-09-17
        相关资源
        最近更新 更多