Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Amazon dynamodb DynamoDB:获取与一个可能键匹配的所有项_Amazon Dynamodb_Data Modeling - Fatal编程技术网

Amazon dynamodb DynamoDB:获取与一个可能键匹配的所有项

Amazon dynamodb DynamoDB:获取与一个可能键匹配的所有项,amazon-dynamodb,data-modeling,Amazon Dynamodb,Data Modeling,假设我有下表- itemA | itemB | relationScore | type ---------------------------------------- "s" | "a" | 1.0 | "foo" "s" | "b" | 1.0 | "bar" ... 这里,itemA+itemB每行都是唯

假设我有下表-

itemA | itemB | relationScore | type
----------------------------------------
"s"   |   "a" |      1.0      |  "foo"
"s"   |   "b" |      1.0      |  "bar"
...
 
这里,
itemA
+
itemB
每行都是唯一的,我将它们分别作为散列键和范围键

然而,我的查询需要我获取所有项目,以便-

  • 项A
    等于(A、B、C、D……)中的一项(即选项列表)
  • 类型
    等于“foo”
  • 我如何构建索引以便能够在不使用扫描/不需要多个查询的情况下实现这一点


    注意:我不想只查询
    类型
    然后在内存中过滤它,因为
    类型
    的基数非常低,最终会返回大量的列表。

    对于您的第一个访问模式,DynamoDB提供了一个操作,可以返回高达16MB的数据并包含多达100个项

    通过在
    type
    字段上创建二级索引,可以访问第二个访问模式。此索引将逻辑上将相同
    类型的所有项分组到同一分区中,您可以通过单个
    查询
    操作检索该分区

    编辑:我误解了这个问题,认为我们讨论的是两种不同的访问模式,而不是单一的访问模式。如上所述,现有数据模型不支持单个查询操作

    跨分区键(条件1)搜索的唯一方法是通过
    scan
    操作或多个查询。如果要在单个查询中执行此操作,则需要存储数据,以便将选项和类型列表分组到单个分区中。这实际上是“预加入”您的数据

    除非我们可以利用您的示例中不明显的数据特征(例如,itemA可按字典顺序排序),否则您将陷入多个查询或扫描操作中。

    可能

    如果您使用
    创建了GSI 散列键:类型
    范围键:itemA

    然后您可以使用GSI和(type=“foo”,itemA在“A”和“D”之间)进行查询

    但显然,这要求itemA值是一个连续的范围。你的例子似乎是这样,但实际数据可能不是这样

    编辑
    由于itemA值实际上不是连续的,而且DDB在
    中不支持
    ,因此您需要处理多个查询

    这并不是世界末日,因为您可以并行执行查询。在这种情况下,我可能会将GSI与
    散列键:itemA
    范围键:类型


    从而确保每个查询都是特定于分区的。(即使您的数据或I/O要求很低,以至于DDB实际上无法创建单个分区)

    是的,这只是一个例子。这不是一个真正的传染范围。DDB不支持
    IN
    操作…因此您需要进行多个查询。我的第二个访问模式的目标是通过
    itemA
    type
    进行查询。仅通过
    类型查询
    将返回一个非常大的结果列表(在我的示例中),结果将被吃掉。如果是这样,请在连接两个属性的字段上构建二级索引。您可以创建一个名为itemA_type的字段,并将其设置为连接字段(例如“s_foo”、“s_bar”等)。如果在itemA_type属性上创建二级索引,则可以同时通过这两个属性获取。仍然需要多个查询我刚刚意识到1和2描述的是相同的访问模式,而不是两个单独的访问模式。在这种情况下,是的,这个数据模型被多个查询卡住了。我更新了我的答案以反映这一点。