database - 如何组织 DynamoDB 表以使用用户和项目?
问题描述
我正在开发一个用户可以拥有“物品”(如库存系统)的项目。
这些项目的结构类似于:
item : {
id: "00000000-0000-0000-0000-000000000000", //uuid
name: "Item Name",
description: "Lorem ipsum dolor sit amet, consectetur adipiscing ..",
image: "image.jpg_00000000-0000-0000-0000-000000000000"
}
主要概念是这些项目将由用户创建(第一个使用它的用户将创建它,然后它将可供其他用户使用)。
在传统的 SQL DB 模式中,我会创建如下内容:
项目:
ID | 姓名 | 描述 | 图片 |
---|---|---|---|
00000000-0000-0000-0000-000000000001 | 项目 01 | Lorem ipsum dolor sit amet, consectetur adipiscing .. | image.jpg_0000-0000-000000-001 |
00000000-0000-0000-0000-000000000002 | 项目 02 | Lorem ipsum dolor sit amet, consectetur adipiscing .. | image.jpg_0000-0000-000000-002 |
00000000-0000-0000-0000-000000000003 | 项目 03 | Lorem ipsum dolor sit amet, consectetur adipiscing .. | image.jpg_0000-0000-000000-003 |
用户数据:
用户名 | ID | 日期 | 数量 | 另一个领域 |
---|---|---|---|---|
示例01 | 00000000-0000-0000-0000-000000000001 | 日期.now() | 1 | “美国广播公司” |
例子02 | 00000000-0000-0000-0000-000000000001 | 日期.now() | 5 | “定义” |
示例01 | 00000000-0000-0000-0000-000000000002 | 日期.now() | 3 | “吉” |
由于我想使用DynamoDB (NoSQL),我不确定我应该如何组织数据库。*
在阅读了几篇文档和帖子后,我看到 NoSQL 的主要思想是避免将数据拆分到不同的表中。甚至一些信息说有时拥有重复数据会更好,我不认为为每个实例创建对象是一个好的解决方案。
在我看来,我有这样的东西,即使我不确定这是否应该是 DynamoDB 的工作方式:
ID | 姓名 | 描述 | 图片 | 用户名 | 日期 | 数量 |
---|---|---|---|---|---|---|
0000000.. | 项目 01 | Lorem ipsum .. | 图片.. | Example01 | 日期.now()+x | 3 |
Example02 | 日期.now()+y | 15 | ||||
0000000.. | 项目 02 | Lorem ipsum .. | 图片.. | |||
0000000.. | 项目 03 | Lorem ipsum .. | 图片.. | Example01 | 日期.now()+z | 1 |
在这种情况下,我应该如何构建我的 DynamoDB?
查看第一个答案中列出的两个视频后的问题更新:
- AWS re:Invent 2019:使用 Amazon DynamoDB 进行数据建模 (CMY304)
- AWS re:Invent 2018:Amazon DynamoDB 深入探讨:DynamoDB 的高级设计模式 (DAT401)
我不得不说,在查看了这两个视频之后,我清楚地了解了我应该如何设计我的数据库的整个过程。
首先我的访问模式是这些:
- 获取项目列表 -> PK: id(按照推荐的语法,这将返回 ITEM#uuid 的列表)
- 获取物品 -> PK = ITEM#uuid
- 获取用户项目列表 -> PK = USER#example01 AND BEGINS_WITH(SK,'ITEM#')
问题是我没有看到任何在桌子上处理“项目列表”的例子。例如,在视频的示例中,用户有“订单”,这些“订单”有“物品”。但没有显示如何“存储”物品。
如果项目只有“id”和“name”,则每次将它们存储在 DynamoDB 项目(“行”)中不会有任何问题。有了这个,如果项目改变了名称,我们就会遇到问题,但这可以通过一个简单的脚本来解决。
当项目有更多字段(例如,“描述”,可能更大)时,问题就来了。在这种情况下,我不确定每次都保存整个项目是否会好。
*这是一个个人项目,主要目标是学习一些“技术”。我知道在这种情况下使用 SQL DB 会更容易。
解决方案
“我应该如何在 DynamoDB 中构建我的数据?”的答案。将始终取决于您打算如何访问数据。例如,考虑以下用例:
- 按用户名获取订单
- 获取过去 24 小时内下的订单
- 获取所有订购商品 X 的用户
在 DynamoDB 中,我们根据应用程序需要如何访问数据(也称为“访问模式”)来存储数据。我上面概述的每种访问模式可能具有完全不同的数据模型。因此,在不知道您要对数据做什么的情况下,很难回答“我应该如何为我的数据建模”这个问题。
开始学习 DynamoDB 数据建模的最佳方式是观看 Alex Debrie 的演讲。在不到 45 分钟的时间里,他描述了 DynamoDB 基础知识并给出了几个数据建模示例(一对一、一对多等)。
DynamoDB 要求您提前批判性地考虑应用程序的访问模式。那么,您要构建什么?
推荐阅读
- reactjs - 如何在 react 组件中测试 api 调用并期望 api 调用成功后视图发生变化?
- c# - System.Data.SqlClient.SqlException:“-”附近的语法不正确
- python - 如何使用python删除重复的数据集
- java - 使用对象类型(长)作为参数类型是一个坏主意吗?
- elasticsearch - 弹性搜索显示不同日期的不同节拍
- symfony4 - Symfony 4:尝试更新 makerBundle 生成的登录表单身份验证器时出现问题,有关 csrfToken 的 RuntimeException
- android - Dagger 2 的 AssistedInject 是如何工作的?
- python - 交换 pandas 字符串列中的两个子字符串
- go - 如何使用 golang 写入已打开的 .xlsx 文件
- css - 如何将凹矩形设置为凸矩形