如何处理DynamoDB的多对多关系



我是dyneDB的新手,正在尝试建立一个电子商务商店。我有一张桌子,上面有用户、产品和订单。

我的访问模式是:

  • 获取用户订单中的所有产品

然后我可以用它来解决用户购物车的类似问题。但我不知道怎么做。我的用户到订单关系是一对多,我的产品到订单关系也是多对多。

我的数据如下:

type Variant = {
size: Sizes;
quantity: number;
price: number;
}
type OrderProduct = {
id: string;
orderId: string;
product: Product;
status: string;
trackingId: string;
}
export type Product = {
id: string;
name: string;
description: string;
category: string;
createdAt: string;
variants: Variant[];
}
export type Order = {
id: string;
userId: string;
products: OrderProduct[];
createdAt: string;
}
export type User = {
id: string;
name: string;
address: string;
}

我在aws上看到过很多对很多关系:aws很多对很多的关系但这并不能真正解释如何进行一对多,然后进行多对多查询。任何关于查询的建议和帮助都将非常棒!

DynamoDB只允许按分区键(和范围键(查询,或按索引查询。

如果有不同的表,则不能执行联接查询。您可能需要创建一个全局辅助索引,然后对此进行查询。

因此,例如,如果您的Product在一个名为";order_id";,你可以做:

const documentClient = new AWS.DynamoDB.DocumentClient();
const orderId = 1234; // the real order id
const options = {
TableName: 'Product',
IndexName: 'OrderIdIndex',
KeyConditionExpression: 'order_id = :order_id',
ExpressionAttributeValues: {
':order_id': orderId
}
};
const response = await documentClient.query(options)

请记住,此示例是修改原始结构。您可能需要添加新的索引和属性

编辑

请记住,索引传播可能会有一些延迟。例如,如果您插入一个新的Product,并且您立即想要使用Index by order_id进行搜索,DynamoDB可能会告诉您没有产品(因为它正在传播数据(。如果这种小延迟是不可接受的,您可能更喜欢先查询订单,然后按Id查询每个产品(如果需要,您可以使用batchGet(

您不在Dynamo中执行关系查询。它不是关系数据库,而是文档数据库。

这意味着最重要的是,将数据存储在多个表中的正常方式,通常是通过SQL中的任何唯一的自动递增标识符,在dynamo中是一种糟糕的方式

相反,您需要根据访问模式存储数据,而这可能会让SQL感到非常奇怪!你有时甚至会觉得自己在复制数据。

由于Dynamo查询需要您知道分区密钥是什么才能进行查询(您不能对PK进行搜索或条件设置(,因此PK需要是启动查询所必须的。

因此,根据您描述的访问模式,您的PK必须是用户。然后,为其购物车中的每个项目单独输入将是进行操作的方式-基本上类似于:

(编辑:当然,你也可以很容易地将用户切换为订单ID(

PK:用户SK:项目#12346123

PK:用户SK:项目#123491239

PK:用户SK:货号113322

甚至可能是

PK:用户SK:META-

具有类似";总项目";或";登录时间";或";提供的销售";或者其他需要追踪的东西。

如果你查询USER的PK,你会得到他们所有项目的列表。他们删除了一个项目,你就删除了与该项目关联的SK文档。它们会增加数量,然后您会增加项目数量属性。等等。

这实际上是一对多关系:一(用户的PK(和多(SK前缀为ITEM#(-然后可以查询PK=User, SK (beginsWith) ITEM#以检索用户的所有项目。

但正如你所看到的,如果你试图建立许多不同的关系,这可能会让变得非常非常复杂——发电机并不是为此而生的。如果您需要做比这样的单个关系更深入的事情,或者需要能够在运行时动态决定关系/查询,那么Dyanmo不是解决方案,SQL是。

最新更新