【发布时间】:2026-01-14 18:35:01
【问题描述】:
我正在开发一个用户可以拥有“items”的项目(例如库存系统)。
这些项目的结构类似于:
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 | name | description | image |
|---|---|---|---|
| 00000000-0000-0000-0000-000000000001 | Item 01 | Lorem ipsum dolor sit amet, consectetur adipiscing .. | image.jpg_0000-0000-000000-001 |
| 00000000-0000-0000-0000-000000000002 | Item 02 | Lorem ipsum dolor sit amet, consectetur adipiscing .. | image.jpg_0000-0000-000000-002 |
| 00000000-0000-0000-0000-000000000003 | Item 03 | Lorem ipsum dolor sit amet, consectetur adipiscing .. | image.jpg_0000-0000-000000-003 |
用户数据:
| username | id | date | amount | another Field |
|---|---|---|---|---|
| example01 | 00000000-0000-0000-0000-000000000001 | Date.now() | 1 | "Abc" |
| example02 | 00000000-0000-0000-0000-000000000001 | Date.now() | 5 | "Def" |
| example01 | 00000000-0000-0000-0000-000000000002 | Date.now() | 3 | "Ghi" |
由于我想使用 DynamoDB (NoSQL),我不确定应该如何组织数据库。 *
在阅读了几篇文档和帖子后,我看到 NoSQL 的主要思想是避免将数据拆分到不同的表中。甚至有些信息说有时重复数据会更好,但我认为为每个实例创建对象并不是一个好的解决方案。
在我看来,我有类似的东西,即使我不确定这是否应该是 DynamoDB 的工作方式:
| id | name | description | image | username | date | amount |
|---|---|---|---|---|---|---|
| 0000000.. | Item 01 | Lorem ipsum .. | image.. | Example01 | Date.now()+x | 3 |
| Example02 | Date.now()+y | 15 | ||||
| 0000000.. | Item 02 | Lorem ipsum .. | image.. | |||
| 0000000.. | Item 03 | Lorem ipsum .. | image.. | Example01 | Date.now()+z | 1 |
在这种情况下我应该如何构建我的 DynamoDB?
在查看第一个答案中列出的两个视频后更新问题:
- AWS re:Invent 2019: Data modeling with Amazon DynamoDB (CMY304)
- AWS re:Invent 2018: Amazon DynamoDB Deep Dive: Advanced Design Patterns for DynamoDB (DAT401)
我不得不说,在查看了这两个视频之后,我清楚地了解了我应该如何设计我的数据库的整个过程。
首先我的访问模式如下:
- 获取项目列表 -> PK: id(按照推荐的语法,这将返回 ITEM#uuid 列表)
- 获取物品 -> PK = ITEM#uuid
- 获取用户项目列表 -> PK = USER#example01 AND BEGINS_WITH(SK,'ITEM#')
问题是我没有看到任何在桌子上处理“项目列表”的例子。 例如,在视频的示例中,用户有“订单”,这些“订单”有“物品”。但没有显示如何“存储”物品。
如果项目只有“id”和“name”,则每次都将它们存储在 DynamoDB 项目(“行”)中不会有任何问题。有了这个,如果项目更改了名称,我们就会遇到问题,但这可以通过一个简单的脚本来解决。
问题来了,当项目有更多字段时(例如,“描述”,可以更大)。在这种情况下,我不确定每次都保存整个项目是否会好。
* 这是一个个人项目,主要目标是学习一些“技术”。我知道在这种情况下使用 SQL DB 会更容易。
【问题讨论】:
-
最大的问题是更新关系与项目本身之间更常见的是什么?如果一个项目被一百万用户使用并且需要更新,如果关系表中的数据重复,您将需要更新一百万条记录。或者,数据可能只是陈旧的。将它放在两个表中也没有什么问题,它只是每个用户的读取次数更多。您是否正在针对读取进行优化?写?物品更新?存储大小?正确的答案取决于您的扩展需求。如果您只支持少数用户和项目,则不同的结构不会产生影响。
-
在尝试设计您的 DynamoDB 表之前,您必须首先回答以下问题:我需要支持哪些数据访问模式?只有知道了答案,才能设计出结构合理的表格。
标签: database data-structures nosql amazon-dynamodb