根据日期和 parent 查询 One-To-Many 的 One-To-Many 关系
Query children of One-To-Many Relationship based on date along with parent
我的发电机中有两个实体 table:用户和订单。
每个 user
都有 0..*
个订单,每个 order
都有一个关联的 user
。每个 order
也有一个 orderDate
属性,描述下订单的时间。
我当前的 table 结构如下,以便高效地检索特定用户的所有订单:
+--------------+----------------+--------------------------------------+
| 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
)下的所有订单(无论用户如何)以及用户( s) 放置它们.
我在 table 设计中很难处理这种访问模式。 GSI 和不同的主键在这里似乎都不起作用,因为我要么必须每天复制每个用户项目,要么我无法与用户一起查询订单。
我的问题有优雅的解决方案吗?
不幸的是,我似乎无法想出一个优雅地解决你的问题的方法。
您需要复制用户信息并存储在订单记录中,或者使用第二个 getItem 来查询 user-specific 信息。
如果谁有更好的解决方案,请告诉我。
这是二级索引的完美用例。这是一种方法:
您可以在分区键 (GSI1PK) 为 ORDERS#<orderDate>
和排序键 (GSI1SK) 为 USER#<user_id>
的订单项上创建二级索引 (GSI1)。它看起来像这样:
您的 GSI1 的逻辑视图如下所示:
GSI1 现在支持查询特定日期的所有订单。
请记住,对数据模型进行反规范化(例如,在订单项中重复用户信息)是 DynamoDB 数据建模中使用的一种常见模式。请记住,space 很便宜!更重要的是,您 pre-joining 您的数据可以支持您的应用程序访问模式。在这种情况下,我会将您需要的任何用户元数据添加到订单项中,以便将其投射到索引中。
有道理吗?
我的发电机中有两个实体 table:用户和订单。
每个 user
都有 0..*
个订单,每个 order
都有一个关联的 user
。每个 order
也有一个 orderDate
属性,描述下订单的时间。
我当前的 table 结构如下,以便高效地检索特定用户的所有订单:
+--------------+----------------+--------------------------------------+
| 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
)下的所有订单(无论用户如何)以及用户( s) 放置它们.
我在 table 设计中很难处理这种访问模式。 GSI 和不同的主键在这里似乎都不起作用,因为我要么必须每天复制每个用户项目,要么我无法与用户一起查询订单。
我的问题有优雅的解决方案吗?
不幸的是,我似乎无法想出一个优雅地解决你的问题的方法。
您需要复制用户信息并存储在订单记录中,或者使用第二个 getItem 来查询 user-specific 信息。
如果谁有更好的解决方案,请告诉我。
这是二级索引的完美用例。这是一种方法:
您可以在分区键 (GSI1PK) 为 ORDERS#<orderDate>
和排序键 (GSI1SK) 为 USER#<user_id>
的订单项上创建二级索引 (GSI1)。它看起来像这样:
您的 GSI1 的逻辑视图如下所示:
GSI1 现在支持查询特定日期的所有订单。
请记住,对数据模型进行反规范化(例如,在订单项中重复用户信息)是 DynamoDB 数据建模中使用的一种常见模式。请记住,space 很便宜!更重要的是,您 pre-joining 您的数据可以支持您的应用程序访问模式。在这种情况下,我会将您需要的任何用户元数据添加到订单项中,以便将其投射到索引中。
有道理吗?