首页 > 解决方案 > 将 SQL 模式建模到 DynamoDB

问题描述

在我的项目中,AWS Lambda 每天从电子商店抓取数据并将其保存到 MySQL。

因为我想更具成本效益,所以我想使用 DynamoDB。

我想怎么查询?

这个机箱适合 Dynamo 吗?模型会是什么样子?

我想到了三种方法,但每种方法都有缺点:

  1. 两个表,第一个是带有抓取数据的产品,第二个是带有产品的类别。这意味着第一个查询来找出类别中的产品,第二个查询是获取产品数据 + 两个同步的表。

  2. productId 上的一个表分区键时间戳上的排序键,对于每次抓取,我将为product 保存 3 行为每个类别保存一行,并使用时间戳作为排序键在类别上创建 GLI。但是如果我每天抓取 100 个产品,每个产品平均分为 8 个类别,那么每天就会有 800 行,只是为了有这种多对多的关系。在一个月内,我将有24k 行。假设我想在一个月后从产品中删除一个类别,我必须更新 240 行?

  3. 或者这种情况不适合 DynamoDB,用 MySQL 会更容易坚持吗?

数据库方案

标签: database-designamazon-dynamodbdatabase-schema

解决方案


你可以把它作为你的桌子。

productId | sortKey         |  GSI1     |
1234232   | event#123232323 |           | price1  | orders1 | rating1 | rating_count1 | created_at1
1234232   | event#123232327 |           | price2  | orders2 | rating2 | rating_count2 | created_at2
1234232   | category#father | Father    | <other properties of category>
1234232   | category#kitchen| kitchen   | <other properties of category?>

这里 productid 是 GSI1 的二级 Key。

这将解决以下用例

  1. 对于一种产品,请参阅事件历史记录。(SELECT* where id=X and sortKey startswith event )

  2. 获取产品的所有类别。(SELECT* where id=X and sortKey startswith category )

  3. 获取一个类别的所有产品。(选择*,其中 GSI1=x)

  4. 从产品中删除一个类别而不更新许多行。(在进行更新时,如果新添加,则获取所有现有类别,如果现有类别不存在,则删除并添加特定事件。)

这是一个很好的视频,解释了架构设计。


推荐阅读