用于存储购物历史记录的 DynamoDB 访问模式

DynamoDB access pattern for storing shopping history

什么是可靠的 DynamoDB 访问模式,用于存储来自一堆相同格式的收据的数据?我会使用 SQL 以获得更高级分析的最大灵活性,但作为一项学习练习,我想看看在这里使用 DynamoDB 可以走多远。对于初学者,我想查询给定时间范围内的总支出和每个产品的总支出,跟踪产品价格历史记录,按总收据排序,等等。但我也希望它尽可能灵活,以应对我尚未想到的未来查询。这样的东西加上一些 GSI 会起作用吗?

-----------------------------------------------------------------------------------------------------------
| pk          | sk                     | unit $ | qty | total $ | receipt total | items
-----------------------------------------------------------------------------------------------------------
| "product a" | "2021-01-01T12:00:00Z" | 2       | 2   | 4      |               |
| "product b" | "2021-01-01T12:00:00Z" | 2       | 3   | 6      |               |
| "receipt"   | "2021-01-01T12:00:00Z" |         |     |        | 10            | array of above item data

| "product a" | "2021-01-02T12:00:00Z" | 1.75    | 3   | 5.25   |               |
| "product c" | "2021-01-02T12:00:00Z" | 2       | 2   | 4      |               |
| "receipt"   | "2021-01-02T12:00:00Z" |         |     |        | 9.25          | array of above item data
-----------------------------------------------------------------------------------------------------------

必须决定您的访问模式,并以此为基础构建发电机的设计,而不是相反。 team/product 之外的任何人都无法告诉您您的访问模式。这完全取决于您的产品需求。

你要问:你有哪些信息,当你有这些信息时,你需要检索什么?然后,您可以决定哪些是最常见的,哪些是最常做的,然后根据这些组合制作您的 PK/SK 组合。如果您不能将所有查询都放入一两个信息中,您可能需要设置一个索引 - 但应该只为访问频率低得多的查询维护索引。

如果需要,它也接受了两次输入相同信息的做法 - 在 table 的两个文档中 - 因为写入 easier/cheaper 而不是多次读取(一次写入几乎是一次每个文档的 WCU - 任何 query/scan 都可以是多个 RCU,即使你只需要一个部分 - 加上索引是 table 的复制意味着如果你 write/read 太快或尝试 write/read 并行调用相同的文档)

现在花点时间坐下来考虑一下您的应用程序需要查询 dynamo 的所有内容。你现在能弄清楚的越多越好,如果你可以将你的 PK 设置为几乎总是可用于尝试查询的调用函数的东西,那么你将处于更好的状态。