单独的 item/details 个表 - DynamoDB 的设计方法不好吗?
Separate item/details tables - is it bad design approach for DynamoDB?
我的用例是显示项目的列表视图和每个项目的详细信息视图以及更多信息。列表中项目显示所需的数据最大为 2KB,其他项目详细信息将在 2KB 到 20KB 的范围内变化。目前,所有与项目相关的数据都存储在一个条目中。将其拆分为具有一对一关系的单独表是否是明智的优化?除了我必须立即更新表并使用 TransactWrite 保持连接一致之外,还有什么缺点吗?
将具有 1:1 关系的记录拆分为单独的 tables 是 DynamoDB 反模式。作为 AWS says:
(1) Schema flexibility lets DynamoDB store complex hierarchical data within a single item. (2) Composite key design lets it store related items close together on the same table.
如果您的查询模式包括请求与摘要信息分开的项目大量详细记录,您可能会受益于在单个 table 中分离摘要和详细记录 .
PK
SK
Note
Item1-ID
Summary
Item1-ID
Detail
Item2-ID
Summary
Item2-ID
Detail
Item2-ID
Detail#History#2021-11-16T13:00:00
Option to add item history
query
操作:
- 项目 1 全部:
PK=Item1ID and SK>""
(2 条记录)
- 项目 1 摘要:
PK=Item1ID and SK=Summary
(1 条记录)
- 项目 1 详细信息:
PK=Item1ID and SK=Details
(1 条记录)
- 项目 2 详细信息 当前 + 历史:
PK=Item2ID and SK begins_with(Details)
(多个)
更棘手的优化是检索许多 Summary
条记录。对于低记录量,scan
可能是可以容忍的。对于低查询量,具有 Summary
或 Summary#Active
的二级索引
(或 add ever-important cardinality 的其他一些细分)可能是 query
的一种可以容忍的方式。或者,如果项目创建量较低,您可以定期将列表结果缓存在单独的记录中。
我的用例是显示项目的列表视图和每个项目的详细信息视图以及更多信息。列表中项目显示所需的数据最大为 2KB,其他项目详细信息将在 2KB 到 20KB 的范围内变化。目前,所有与项目相关的数据都存储在一个条目中。将其拆分为具有一对一关系的单独表是否是明智的优化?除了我必须立即更新表并使用 TransactWrite 保持连接一致之外,还有什么缺点吗?
将具有 1:1 关系的记录拆分为单独的 tables 是 DynamoDB 反模式。作为 AWS says:
(1) Schema flexibility lets DynamoDB store complex hierarchical data within a single item. (2) Composite key design lets it store related items close together on the same table.
如果您的查询模式包括请求与摘要信息分开的项目大量详细记录,您可能会受益于在单个 table 中分离摘要和详细记录 .
PK | SK | Note |
---|---|---|
Item1-ID | Summary | |
Item1-ID | Detail | |
Item2-ID | Summary | |
Item2-ID | Detail | |
Item2-ID | Detail#History#2021-11-16T13:00:00 | Option to add item history |
query
操作:
- 项目 1 全部:
PK=Item1ID and SK>""
(2 条记录) - 项目 1 摘要:
PK=Item1ID and SK=Summary
(1 条记录) - 项目 1 详细信息:
PK=Item1ID and SK=Details
(1 条记录) - 项目 2 详细信息 当前 + 历史:
PK=Item2ID and SK begins_with(Details)
(多个)
更棘手的优化是检索许多 Summary
条记录。对于低记录量,scan
可能是可以容忍的。对于低查询量,具有 Summary
或 Summary#Active
的二级索引
(或 add ever-important cardinality 的其他一些细分)可能是 query
的一种可以容忍的方式。或者,如果项目创建量较低,您可以定期将列表结果缓存在单独的记录中。