如何组织 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 sat amet,consectetur adipiscing .. image.jpg_0000-0000-000000-001
00000000-0000-0000-0000-000000000002 项目 02 Lorem ipsum dolor sat amet,consectetur adipiscing .. image.jpg_0000-0000-000000-002
00000000-0000-0000-0000-000000000003 项目 03 Lorem ipsum dolor sat amet,consectetur adipiscing .. image.jpg_0000-0000-000000-003

用户数据:

用户名 id 日期 金额 一个字段
example01 00000000-0000-0000-0000-000000000001 Date.Now() 1 “ABC”
example02 00000000-0000-0000-0000-000000000001 Date.Now() 5 “定义”
example01 00000000-0000-0000-0000-000000000002 Date.Now() 3 “吉”

由于我想使用 DynamoDB (Nosql),我不确定应该如何组织数据库。 *

在阅读了一些文档和帖子后,我看到 Nosql 的主要思想是避免将数据拆分到不同的表中。甚至有些信息说有时候有重复的数据会更好,但我不认为为每个实例创建对象是一个好的解决方案。

在我看来,我有这样的想法,即使我不确定这是否应该是 DynamoDB 的工作方式:

id 姓名 描述 图片 用户名 日期 金额
0000000.. 项目 01 Lorem ipsum .. 图像.. 示例01 Date.Now()+x 3
示例02 Date.Now()+y 15
0000000.. 项目 02 Lorem ipsum .. 图像..
0000000.. 项目 03 Lorem ipsum .. 图像.. 示例01 Date.Now()+z 1

在这种情况下,我应该如何构建我的 DynamoDB?



在查看第一个答案中列出的两个视频后更新问题:

我不得不说,在查看了两个视频后,我对如何设计数据库的整个过程有了更清晰的了解。

首先,我的访问模式是:

  • 获取项目列表 -> 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 数据建模的最佳方式是watch this talk by Alex Debrie。在不到 45 分钟的时间内,他介绍了 DynamoDB 基础知识并给出了几个数据建模示例(一对一、一对多等)。

DynamoDB 要求您提前批判性地考虑应用程序的访问模式。那么,您要构建什么?