Nosql 基于日期和父项查询一对多关系的子项
我的dynamo表中有两个实体:User和Order 每个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
用户
都有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
属性,然后用一些基本信息填充该属性。这将使得对用户属性的更新效率极低,尽管我必须扫描表中的所有订单。