database-design - 将 SQL 模式建模到 DynamoDB
问题描述
在我的项目中,AWS Lambda 每天从电子商店抓取数据并将其保存到 MySQL。
因为我想更具成本效益,所以我想使用 DynamoDB。
我想怎么查询?
- 按productId(很清楚)
- 按类别(最新抓取的 product_data -价格、评级等) - 表示父亲、厨房和刀具类别中的所有产品
这个机箱适合 Dynamo 吗?模型会是什么样子?
我想到了三种方法,但每种方法都有缺点:
有两个表,第一个是带有抓取数据的产品,第二个是带有产品的类别。这意味着第一个查询来找出类别中的产品,第二个查询是获取产品数据 + 两个同步的表。
productId 上的一个表分区键,时间戳上的排序键,对于每次抓取,我将为product 保存 3 行,为每个类别保存一行,并使用时间戳作为排序键在类别上创建 GLI。但是如果我每天抓取 100 个产品,每个产品平均分为 8 个类别,那么每天就会有 800 行,只是为了有这种多对多的关系。在一个月内,我将有24k 行。假设我想在一个月后从产品中删除一个类别,我必须更新 240 行?
或者这种情况不适合 DynamoDB,用 MySQL 会更容易坚持吗?
解决方案
你可以把它作为你的桌子。
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。
这将解决以下用例
对于一种产品,请参阅事件历史记录。(SELECT* where id=X and sortKey startswith event )
获取产品的所有类别。(SELECT* where id=X and sortKey startswith category )
获取一个类别的所有产品。(选择*,其中 GSI1=x)
从产品中删除一个类别而不更新许多行。(在进行更新时,如果新添加,则获取所有现有类别,如果现有类别不存在,则删除并添加特定事件。)
这是一个很好的视频,解释了架构设计。
推荐阅读
- data-structures - 如何将flutter项目从windows导入linux?
- android - 如何在 Firebase 控制台中读取事件 SELECT_CONTENT 的详细信息
- ios - 滚动时是否可以禁用 UITableview 多个“cellForRowAt”方法调用?
- ios - 如何更新 WDA WebDriverAgentRunner 产品构建版本?
- x86 - 为什么编译器将数据放在 PE 和 ELF 文件的 .text(code) 部分,CPU 如何区分数据和代码?
- blueprism - Blue Prism - 在一个过程中使用多个应用程序 - 保留相关数据
- python - 从周围的边界框中提取车牌平行四边形?
- algorithm - 如何遍历一棵树以找到最小值
- javascript - style.styleSheet.cssText 在 IE 9 上不起作用
- azure-active-directory - 如何将restapi响应中的列映射到数据库表列?