Dynamo组成的本地二级索引

时间:2013-10-31 10:06:46

标签: database-design nosql amazon-dynamodb

我正在尝试设置一个新的DynamoDB表,我打算第一次使用本地二级索引(LSI)。

然而,我发现自己在努力创造它们。我没有在Amazon API中找到任何使用组合哈希键创建LSI的引用(哈希键存在于多个属性之外)。

这就是我的模型的样子,它表示从UserA发送到UserB的消息:

  • UserAId
  • UserBId
  • 日期时间
  • 状态(1,2,3,4,5)
  • isPriority(0或1)
  • isNewsLetter(0或1)

我想要执行的查询如下

  1. 从按日期排序的UserAId获取所有邮件
  2. 从UserAId获取所有消息到UserBId
  3. 从UserAId获取具有按dateTime
  4. 排序的特定状态(1或2)的所有消息
  5. 从UserAId获取具有特定状态(1或2)的所有消息对于今天由dateTime命令
  6. 获取来自UserAId的所有优先级消息,按dateTime排序
  7. 从UserAId获取具有特定状态(1或2)的所有消息,其中isNewsLetter = 1按状态排序
  8. 对于我选择了UserAId的hashKey,Range键是dateTIme。这应该涵盖我需要执行最多的查询(查询1)并且应该均匀地分布数据。

    对于其他查询,我正在考虑以下LSI的

    • 查询2:哈希UserAId,范围UserBId
    • 查询3:哈希UserAId,范围(撰写)status-dateTime。这样我可以用BEGINS_WITH查询1和BEGINS_WITH 2,按日期排序应该是自动然后我认为
    • 查询4:与上述相同
    • 查询5:哈希UserAId,范围(组成)isPriority-dateTime。查询BEGINS_WITH 1,订单应该自动然后我认为
    • 查询6:哈希UserAId,范围(编组)status-isNewsLetter。这样它应该按照我想的状态订购

    我的问题是:

    • 是否可以在LSI中使用组合键?我该如何定义它们?亚马逊提供的文档中没有任何相关内容。这就是我定义普通LSI的方法:
    'KeySchema' => array(
      array('AttributeName' => 'UserAId', 'KeyType' => 'HASH'),
      array('AttributeName' => 'status',  'KeyType' => 'RANGE'),
    ),
    

    那么如何定义使用status-isNesLetter呢?

    • 我对排序的假设是否正确?

    提前致谢

1 个答案:

答案 0 :(得分:1)

经过一些研究和一些测试后,我现在可以回答我自己的问题了。

问题1) 不,您无法在keyschema中定义组合范围键。但是,您可以在模型类中创建单独的属性来表示相同的内容

实施例: 对于查询3,您需要向模型添加新属性,并自行合并属性status和dateTime。

问题2)是的。您还可以使用ScanIndexForward将订单更改为DESC / ASC