Nosql 基于日期和父项查询一对多关系的子项

Nosql 基于日期和父项查询一对多关系的子项,nosql,amazon-dynamodb,data-modeling,dynamodb-queries,amazon-dynamodb-data-modeling,Nosql,Amazon Dynamodb,Data Modeling,Dynamodb Queries,Amazon Dynamodb Data Modeling,我的dynamo表中有两个实体:User和Order 每个用户都有0..*订单,每个订单都有一个关联的用户。每个订单还具有一个orderDate属性,该属性描述订单的下单时间。 我的当前表的结构如下,以使检索特定用户的所有订单变得高效: +--------------+----------------+--------------------------------------+ | PK | SK | Attributes

我的dynamo表中有两个实体:User和Order

每个
用户
都有
0..*
订单,每个
订单
都有一个关联的
用户
。每个
订单
还具有一个
orderDate
属性,该属性描述订单的下单时间。 我的当前表的结构如下,以使检索特定用户的所有订单变得高效:

+--------------+----------------+--------------------------------------+
| PK           | SK             |              Attributes              |
+--------------+----------------+-------------+-----------+------------+
|              |                | name        | firstName | birthDate  |
+--------------+----------------+-------------+-----------+------------+
| USER#userid1 | META#userid1   | Foo         | Bar       | 2000-10-10 |
+--------------+----------------+-------------+-----------+------------+
|              |                | orderDate   |           |            |
+--------------+----------------+-------------+-----------+------------+
| USER#userid1 | ORDER#orderid1 | 2020-05-10  |           |            |
+--------------+----------------+-------------+-----------+------------+
现在我有了第二个访问模式,我想查询在特定日期(例如,
2020-05-10
下的所有订单(不考虑用户)以及下订单的用户

我正努力在我的表设计中处理这种访问模式。GSIs和不同的主键在这里似乎都不起作用,因为我要么每天都要复制每个用户项,要么无法与用户一起查询订单


我的问题有一个优雅的解决方案吗?

不幸的是,我似乎无法找到一个优雅地解决你问题的方法

您需要复制用户信息并存储在订单记录中,或者使用第二个getItem查询用户特定的信息


如果有人有更好的解决方案,请告诉我。

不幸的是,我似乎无法找到一种优雅地解决您问题的方法

您需要复制用户信息并存储在订单记录中,或者使用第二个getItem查询用户特定的信息


如果有人有更好的解决方案,请告诉我。

这是一个完美的二级索引用例。这里有一种方法:

您可以使用
ORDERS.
的分区键(GSI1PK)和
USER.
的排序键(GSI1SK)在订单项上创建二级索引(GSI1)。它看起来像这样:

GSI1的逻辑视图如下所示:

GSI1现在支持查询特定日期下的所有订单

请记住,数据模型的非规范化(例如,在订单项中重复用户信息)是DynamoDB数据建模中使用的常见模式。记住,空间是便宜的!更重要的是,您正在预加入数据以支持应用程序访问模式。在本例中,我将向订单项添加您需要的任何用户元数据,以便将其投影到索引中


有意义吗?

这是二级索引的完美用例。这里有一种方法:

您可以使用
ORDERS.
的分区键(GSI1PK)和
USER.
的排序键(GSI1SK)在订单项上创建二级索引(GSI1)。它看起来像这样:

GSI1的逻辑视图如下所示:

GSI1现在支持查询特定日期下的所有订单

请记住,数据模型的非规范化(例如,在订单项中重复用户信息)是DynamoDB数据建模中使用的常见模式。记住,空间是便宜的!更重要的是,您正在预加入数据以支持应用程序访问模式。在本例中,我将向订单项添加您需要的任何用户元数据,以便将其投影到索引中


有意义吗?

有两个选项:复制用户信息并存储在订单记录中,或者使用第二个getItem查询用户特定的信息。@jellycsc好的,这就是我的想法-无论哪种方式都不是最佳解决方案。如果你再次将其作为答案发布,我将接受。解决方案的一部分是对数据进行非规范化(复制用户信息),但仍然不能解决按订单日期搜索的问题。我在下面提供了一个答案,其中包含一个不需要多次查询的解决方案两个选项:复制用户信息并存储在订单记录中,或者使用第二个getItem来查询用户特定的信息。@Jelly CSC Ok,这就是我所想的-无论哪种方式都是次优解决方案。如果你再次将其作为答案发布,我将接受。解决方案的一部分是对数据进行非规范化(复制用户信息),但仍然不能解决按订单日期搜索的问题。我在下面提供了一个解决方案,该解决方案不需要多次查询是的,这是建模问题“按日期获取所有订单”部分的最有效方法。我真正能做的就是为每个订单添加一个
user
属性,然后用一些基本信息填充该属性。这将使用户属性的更新效率极低,尽管我必须扫描表中的所有订单。是的,这是建模问题“按日期获取所有订单”部分的最有效方法。我真正能做的就是为每个订单添加一个
user
属性,然后用一些基本信息填充该属性。这将使得对用户属性的更新效率极低,尽管我必须扫描表中的所有订单。