【问题标题】:Query children of One-To-Many Relationship based on date along with parent根据日期和父级查询一对多关系的子级
【发布时间】:2020-11-29 04:53:51
【问题描述】:

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

每个user 都有0..* 订单,每个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 来查询用户特定信息。
  • @jellycsc 好的,这就是我的想法 - 无论哪种方式都不是最佳解决方案。如果您再次发布它作为答案,我会接受它。
  • 非规范化数据(复制用户信息)是解决方案的一部分,但仍然没有解决按订单日期搜索的问题。我在下面提供了一个不需要多次查询的解决方案的答案

标签: nosql amazon-dynamodb data-modeling dynamodb-queries amazon-dynamodb-data-modeling


【解决方案1】:

很遗憾,我似乎无法找到优雅地解决您的问题的方法。

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

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

【讨论】:

    【解决方案2】:

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

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

    GSI1 的逻辑视图如下所示:

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

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

    有意义吗?

    【讨论】:

    • 是的,这是对问题的“按日期获取所有订单”部分建模的最有效方法。我确实可以做的是为每个订单添加一个user 属性,然后用一些基本信息填充它。这将使更新用户属性的效率极低,因为我必须扫描表中的所有订单。
    • 在本例中,如果我想存储付款明细以进行订购,那么 PK、SK、GSI_2_PK 和 GSI_2_SK 是什么? PK = USER#userId1, SK=Order#orderId1, GSI_2_PK=payment_id_1, GSI_2_SK= 'provider_1' 。请告诉我逻辑是否正确。
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 2016-04-20
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    相关资源
    最近更新 更多