Dynamodb表设计过滤多个键

时间:2013-12-01 13:47:08

标签: database-design amazon-dynamodb

我已阅读dynamodb best practises,我正在尝试设计一个表,允许我以灵活的方式查询它并避免扫描。

这是我能得到的最佳设计:

表:项目
哈希: ClientId #ProjectId
范围:名称
其他属性:

  • CreatedAt(时间戳)
  • 标签(TagId1,TagId2,TagId3)
  • 类型

请注意,我在范围键中将多个值放在哈希中,并使用“#”作为分隔符,以便具有更大的查询功能。
我的实际架构允许我以下列方式查询表:

  • 获取客户的所有项目(运营商:BEGIN_WITH)
  • 通过知道客户端ID(运营商:EQ)
  • 的ID获取特定项目
  • 按名称
  • 订购结果
  • 在名称
  • 上过滤结果

除了已有的过滤功能外,我还希望我的用户也可以过滤“tags”属性 我还需要我的用户通过CreationAt而不是名称订购,但仍然可以过滤名称。

以下是我无法使用以下方案进行的示例查询:

获取给定客户的所有项目,按“CreationAt”排序,包含特定的“TagId”,以及给定的名称和类型。

我无法实现的另一个问题,可能更简单:
获取包含名称部分和给定类型的给定子字符串的客户端的所有项目。

对我的实际情况有何评论?
如何优化呢?
如何设计我的辅助本地索引或自定义索引表以便能够实现我的请求?
有没有办法重现mysql的“LIKE”比较运算符?

我开始问自己,dynamodb是否适合我的项目。

感谢您的投入。

1 个答案:

答案 0 :(得分:2)

我认为你混淆了哈希和范围键。

您应该将clientId作为哈希,将projectId作为范围。 这将允许您快速获取客户端的所有项目(QUERY)和项目的快速行检索(GET)。

您想要查询的其余条件在DynamoDB条件下可能是合理的,但是 - 如果特定客户端的项目数量不大,则可能更容易将逻辑移动到应用程序层之后使用QUERY

编辑:

关于复杂查询:使用辅助索引,您将无法在条件之间将查询与AND / OR组合。