DynamoDB 不是关系数据库。您无法执行您正在考虑的关系请求类型(特别是在您的问题 #2 中描述的单个查询中)。它需要以不同的方式思考您将如何存储和访问您的数据,因此它可能不适合您的应用程序。
Dynamo 不提供外键或表连接。每个表都有一个分区键 (PK),或分区键和排序键 (SK) 的组合。当一个表只有一个 PK 时,只能查询单个项。当它同时有PK和SK时,可以通过PK/SK查询单个item,也可以查询所有共享同一个PK的item。
您所描述的实现 1 对 N 数据的一种方法如下所示:
Table: Users
------------
[PK] userId
username
fname
lname
Table: Addresses
----------------
[PK] userId
[SK] addressId
address line 1
address line 2
city
zip
state
country
在此布局中,您仍需要两次调用 Dynamo 来获取用户的所有信息,包括地址。您将通过该 userId 对 Users 表进行一次 getItem 调用,并通过同一 userId 对 Addresses 进行查询调用。第一次调用将返回单个用户记录,第二次调用将返回按 addressId 排序的地址记录列表。
您必须手动管理您的数据。由于没有外键,因此也没有约束或级联。如果您不小心,很容易得到孤立的数据。同样,Dynamo 可能不是最适合您的应用程序的工具。
我在这里所描述的只是表面。对于希望使用 DynamoDB 构建企业软件进行数据存储的任何人来说,了解其架构方法和最佳实践至关重要。来自 SQL 甚至 MongoDB 的背景,你的直觉可能会让你误入歧途,导致你构建的东西性能不佳并且难以调试。对于正确的工作类型,它是一个非常强大的工具,但您必须先进行尽职调查才能了解它。
--
编辑补充:我上面描述的方法甚至不是一个好方法! AWS 共享了文档并讨论了这类事情,包括他们的Best Practices for DynamoDB,这远远超出了这个答案的范围。