DynamoDb映射与字符串属性读取/更新

时间:2016-10-31 13:00:00

标签: amazon-dynamodb

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

  1. 我需要知道有多少张名称和类型为user1的牌,
  2. 需要获得user1的国家/地区
  3. 需要获取user1持卡1类金卡类型 持有,这是在今年购买和什么是国家 USER1。
  4. 为实现这一目标,我可以通过两种方式设计我的架构: -

    1. 每个项目都有属性(除了用户ID分区键)(国家/地区,名称字符串,电子邮件字符串,卡片) 地图{ “卡1”:{ “而purchaseDate”: “YYYY-MM-DD”, “类型”: “金”}, “卡2”:{{ “而purchaseDate”: “YYYY-MM-DD”, “类型”: “铂”}}}
    2. 将用户ID作为主键和卡类别作为排序键,并将用户信息保存在项目中,其中键为userid_all,卡片信息位于项目中 key为userid_card1,字符串类型属性为purchaseate 并输入。比如userid1_all:country:Us,email:abc@abc.com userid_card1:purchaseate:yyyy-mm-dd,type:gold
    3. 哪种方法更好?

      1. 从map属性中读取数据更好,或者从字符串属性中读取数据。
      2. 使用地图类型更新属性(比如说card1类型的userid1从黄金升级到白金)更好或是字符串类型。
      3. 由于

1 个答案:

答案 0 :(得分:0)

虽然DynamoDB支持Document数据类型(Map,List等),但查询API不是很强大。在您的设计方法1中,如果您将数据转换为DynamoDB项目,您实际上将最终得到复杂对象(即card1值是具有两个属性purchaseate和type的对象),用于cards属性。第三个查询模式需要按purchaseate过滤并键入哪个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 更好。只要您有标量属性(即字符串,数字,布尔值),您就可以通过 FilterExpression 中不同的属性组合查询表格。