1

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

然而,我发现自己在努力创造它们。在使用组合散列键(存在多个属性的散列键)创建 LSI 时,我在 Amazon API 中没有找到任何参考。

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

  • 用户 ID
  • 用户标识符
  • 约会时间
  • 状态 (1, 2, 3, 4, 5)
  • isPriority(0 或 1)
  • isNewsLetter (0 或 1)

我想做的查询如下

  1. 获取按日期排序的来自 UserAId 的所有消息
  2. 获取从 UserAId 到 UserBId 的所有消息
  3. 获取来自 UserAId 的具有特定状态(1 或 2)的所有消息,按 dateTime 排序
  4. 从 UserAId 获取具有特定状态(1 或 2)的所有消息 对于今天按 dateTime 排序
  5. 从 UserAId 中获取按日期时间排序的所有优先级消息
  6. 从 UserAId 获取具有特定状态(1 或 2)且 isNewsLetter = 1 按状态排序的所有消息

对于我选择 UserAId 的 hashKey,Range 键是 dateTIme。这应该涵盖我最需要执行的查询(查询 1),并且应该均匀地分布数据。

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

  • 查询2:散列UserAId,范围UserBId
  • 查询 3:哈希 UserAId,范围(组合)状态-日期时间。这样我可以使用 BEGINS_WITH 1 AND BEGINS_WITH 2 进行查询,按日期排序应该是自动的,然后我认为
  • 查询4:同上
  • 查询5:Hash UserAId,Range(组合)isPriority-dateTime。查询BEGINS_WITH 1,订单应该自动然后我想
  • 查询 6:哈希 UserAId,范围(组合)状态-isNewsLetter。这样它应该根据我认为的状态排序

我的问题是:

  • 是否可以在 LSI 中使用组合键?我如何定义它们?亚马逊提供的文档中对此一无所知。这就是我定义普通 LSI 的方式:
'KeySchema' => array(
  array('AttributeName' => 'UserAId', 'KeyType' => 'HASH'),
  array('AttributeName' => 'status',  'KeyType' => 'RANGE'),
),

那么我如何在那里定义以使用 status-isNesLetter 例如?

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

提前致谢

4

1 回答 1

1

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

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

示例:对于查询 3,您需要向模型添加一个新属性并自己合并属性 status 和 dateTime。

问题2)是的。您也可以使用 ScanIndexForward 将顺序更改为 DESC/ASC

于 2013-11-01T09:15:52.077 回答