DynamoDB在两个范围上查询,然后对

时间:2018-04-22 07:05:05

标签: java amazon-dynamodb

假设我有一张专辑表,其中分区键是作者,排序键是专辑。每个项目还有price,startDate和endDate属性。假设我想找到所有的专辑“author = a”,“album = b”,“startDate< c“,”endDate> d“和”价格在e和f之间“,按价格排序。最有效的方法是查询分区键和排序键,然后在条件c,d,e和f上过滤结果,然后按价格排序?辅助索引可以帮助吗? (似乎一个二级索引只能用于查询一个或两个非键属性,但我的用例需要对多个非键属性进行<和>操作然后排序)

谢谢!

1 个答案:

答案 0 :(得分:1)

我正在通过类似的架构设计流程。 简短的回答是,它将取决于您拥有多少属于各种类别的数据,以及您希望针对该数据运行的确切数据。

  

要记住的主要事情是,您只能根据排序键(您知道分区键)进行查询,但您还必须保持唯一性,以便不覆盖所需的数据。

在您的案例中可视化的一个好方法如下:

  1. 每个艺术家都是独一无二的(艺术家在我看来就像一个好的分区键)
  2. 每个艺术家都可以拥有多个专辑,使其成为一个很好的排序键(如果您要搜索已知艺术家的专辑)
  3. 在上述情况下,您的排序键将与您的分区键组合以根据以下答案创建您的哈希键(值得一读!),以便您可以在您知道艺术家的情况下编写查询但仅限于部分标题。

    IE中。这里artist =“Pink Floyd”QUERY where string album包含“Moon” 这将匹配“Pink Floyd”月球黑暗面。

    据说,由于分区键和分类键结合起来处理唯一性,因此您只能拥有Pink Floyd的一个“价格” - 月亮的黑暗面。当您使用第二个价格更新条目时,您将覆盖现有对象。

      

    所以真正的问题是,我的用例最好的排序键是什么?

    要回答这个问题,您需要在构建系统之前了解最常见的问题。

    基于价格的查询?

    在您的问题中,您提到了在您看来知道艺术家和专辑的情况下的价格属性。

      

    “author = a”,“album = b”,“startDated”和“价格介于e和f之间”,按价格排序“

    在这种情况下,对于我来说,你可能不了解艺术家,或者如果你这样做,你可能不知道专辑,因为你可能正在寻找一个查询来回复多个艺术家的专辑或者至少有多个专辑来自同一位艺术家。

    如果您要创建包含多个条目的数据库(例如来自多个以不同价格销售同一艺术家/专辑的供应商),情况可能并非如此。在这种情况下,我会说最简单的方法是以给定的价格(排序键)为Artist-Album(分区键)仅存储一个条目,但是你将失去与Artist-Album相同价格匹配的所有其他条目。

    多个查询 MAY 需要多个表

    我有一个类似的用例,最后需要创建多个表来处理我的查询。数据从一个表传递/处理,并使用在插入时触发的Lambda吐出到另一个表中。然后,我将一些查询发送到一个表,并将其他一些查询发送到初始表。