【问题标题】:How to organize DynamoDB tables to work with Users and Items?如何组织 DynamoDB 表以使用用户和项目?
【发布时间】: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?



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

我不得不说,在查看了这两个视频之后,我清楚地了解了我应该如何设计我的数据库的整个过程。

首先我的访问模式如下:

  • 获取项目列表 -> 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


【解决方案1】:

“我应该如何在 DynamoDB 中构建我的数据?”的答案总是取决于您打算如何访问数据。例如,考虑以下用例:

  • 按用户名获取订单
  • 获取过去 24 小时内的订单
  • 获取所有订购商品 X 的用户

在 DynamoDB 中,我们根据应用程序访问数据的方式(也称为“访问模式”)存储数据。我上面概述的每种访问模式可能具有完全不同的数据模型。因此,如果不知道您要对数据做什么,就很难回答“我应该如何为我的数据建模”这个问题。

开始学习 DynamoDB 数据建模的最佳方式是watch this talk by Alex Debrie。在不到 45 分钟的时间里,他介绍了 DynamoDB 基础知识并提供了几个数据建模示例(一对一、一对多等)。

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

【讨论】:

  • 这是另一个 AWS re-:Invent 演讲,这对我来说恰巧是一个灯泡时刻:youtube.com/watch?v=HaEPXoXVf2k
  • 首先,感谢视频! SethGeoghegan 和@JohnDibling 很抱歉回答迟了,我一直在观看这两个视频(2 小时的视频 + 一些时间回顾/搜索概念)。我已经根据您的视频更新了我最初的问题(从现在开始,我认为我对 NoSQL/DynamoDB 有了进一步的了解)。
  • @SpykeRel04D 亚马逊在他们的文档中有一个数据模型示例可以解决您的问题。他们对客户、订单和产品(除其他外)进行建模,展示如何在 DynamoDB 中对这些关系进行建模。 docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
  • @SpykeRel04D AWS 还有一个名为 NoSQL Workbench 的工具,我用它来可视化地为我的表建模。该工具还附带了一些相当先进的示例数据库,我发现它们很有帮助。看看这个! docs.aws.amazon.com/amazondynamodb/latest/developerguide/…