繁体   English   中英

根据日期与父对象一起查询一对多关系的子对象

[英]Query children of One-To-Many Relationship based on date along with parent

我的发电机表中有两个实体:用户和订单。

每个user0..*个订单,每个order都有一个关联的user 每个order还有一个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 )放置的所有订单(无论用户如何)以及放置它们的用户

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

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

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

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

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

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

您可以使用ORDERS#<orderDate>的分区键 (GSI1PK) 和USER#<user_id>的排序键 (GSI1SK) 在 Order 项目上创建二级索引 (GSI1)。 它看起来像这样:

用户订单

GSI1 的逻辑视图如下所示:

在此处输入图像描述

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

请记住,非规范化数据 model(例如,在 Order 项目中重复用户信息)是 DynamoDB 数据建模中使用的常见模式。 请记住,空间很便宜,更重要的是。 在这种情况下,您正在预先加入您的数据以支持您的应用程序访问模式。 我会将您需要的任何用户元数据添加到 Order 项目中,以便将其投影到索引中。

说得通?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM