Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DynamoDB查询两个范围,然后排序_Java_Amazon Dynamodb - Fatal编程技术网

Java DynamoDB查询两个范围,然后排序

Java DynamoDB查询两个范围,然后排序,java,amazon-dynamodb,Java,Amazon Dynamodb,假设我有一个相册表,其中分区键是author,排序键是album。每个项目还具有price、startDate和endDate属性。假设我想找到“author=a”、“album=b”、“startDated”和“price在e和f之间”的所有专辑,按价格排序。最有效的方法是查询分区键和排序键,然后过滤条件c、d、e和f的结果,然后按价格排序吗?二级索引在这里有帮助吗?(一个二级索引似乎只能用于查询一个或两个非关键属性,但我的用例要求对多个非关键属性执行操作,然后进行排序) 谢谢 我正在经历一个

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


谢谢

我正在经历一个类似的模式设计过程。 简而言之,这将取决于您有多少属于不同类别的数据,以及您希望针对这些数据运行的确切查询

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

在您的案例中,将此可视化的好方法如下:

  • 每个艺术家都是独一无二的(在我看来,艺术家就像一个好的分区键)
  • 每个艺术家都可以拥有多张相册,这是一个很好的排序键(在您将搜索已知艺术家的相册的情况下)
  • 在上面的例子中,排序键与分区键结合在一起,根据下面的答案创建哈希键(值得一读!),这样您就可以编写一个查询,其中您知道艺术家,但只知道标题的一部分

    Ie.here artist=“Pink Floyd”查询字符串相册中包含“Moon”的位置 这将匹配“粉红弗洛伊德”月球的黑暗面

    也就是说,对于PinkFloyd,你只有一个“价格”——月亮的黑暗面,因为分区键和排序键结合起来处理唯一性。当您使用第二个价格更新条目时,您将覆盖现有对象

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

    要回答这个问题,您需要在构建系统之前知道最频繁的查询。

    基于价格的查询? 在您的问题中,您提到了一个案例中的价格属性,您似乎了解艺术家和专辑

    “作者=a”、“专辑=b”、“开始日期”和“价格介于e和f之间”,按价格排序

    对我来说,在这种情况下,您可能不知道艺术家,或者如果您知道,您可能不知道专辑,因为您可能正在寻找编写一个查询,返回来自多个艺术家的专辑或来自同一艺术家的至少多个专辑

    然而

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

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