【问题标题】:DynamoDb map vs string attribute read /updateDynamoDb 映射与字符串属性读取/更新
【发布时间】:2017-03-13 13:35:22
【问题描述】:

我有一个 dynamodb 表,其中分区键是均匀分布的用户 ID。表存储有关用户信息的数据,如用户持有的(姓名、电子邮件、国家和门户卡 - 假设用户 1 有卡 1、卡 2、卡 3(最多 10 个卡类别),卡 1 的详细信息为(金卡,购买日期-yyyy- mm-dd)。用户可以通过 userid 对表进行查询。

  1. 我需要获取多少张姓名和类型为 user1 的卡片,
  2. 需要获取用户1的国家
  3. 需要获取user1是否持有card1类别的金卡 持有,是当年购买的,是哪个国家的 用户 1。

为了实现这一点,我可以通过 2 种方式设计我的架构:-

  1. 每个项目都有属性(除了用户 ID 分区键)为(国家字符串、名称字符串、电子邮件字符串、卡片 地图{"card1":{"purchasedate":"yyyy-mm-dd","type":"gold"},"card2":{{"purchasedate":"yyyy-mm-dd","type": “白金”}}}
  2. 将 userid 作为主键,将卡片类别作为排序键,并将用户信息保留在 key 为 userid_all 的 item 中,并将卡片信息保留在 item 中 键为 userid_card1,字符串类型的属性为 purchaseate 和类型。说 userid1_all : country:Us,email:abc@abc.com userid_card1: purchaseate:yyyy-mm-dd,type:gold

哪种方法更好?

  1. 从地图属性或字符串属性读取数据更好。
  2. 用地图类型更新属性(比如card1类型的userid1从黄金升级到白金)或字符串类型更好。

谢谢

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    虽然 DynamoDB 支持文档数据类型(地图、列表等),但查询 API 不是很健壮。在您的设计方法 1 中,如果您将数据转换为 DynamoDB 项目,您实际上最终会得到卡片属性的复杂对象(即 card1 值是具有两个属性 purchaseate 和 type 的对象)。第三种查询模式需要按购买日期和类型进行过滤,而 DynamoDB API 不支持,因为它位于另一个 MAP 数据类型的对象中,而不是 MAP 中的某个标量属性。

    MAP 的简单对象:-

    {"purchasedate":"yyyy-mm-dd","type":"gold"}
    

    MAP的复杂对象:-

    {"card1":{"purchasedate":"yyyy-mm-dd","type":"gold"},"card2":{"purchasedate":"yyyy-mm-dd","type":"platinum"}}
    

    所以,设计方法2更好。只要你有标量属性(即String、Number、Boolean),就可以通过FilterExpression中的不同属性组合查询表。

    【讨论】:

    • 所以如果我使用方法 2,我将不得不对 dynamodb 进行 2 次调用以获取第三个查询模式 - 获取国家和 card1 详细信息?对于查询模式 1,将使用相同的分区键 user1 获取多个项目-这会比在方法 1 中返回 1 个项目更昂贵吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2018-11-28
    • 2017-03-10
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多