我正在完成类似的架构设计过程。
简短的回答是,这将取决于您拥有多少属于不同类别的数据,以及您希望针对这些数据运行的确切查询。
要记住的主要事情是,您只能根据您的排序键(您知道分区键)进行查询,但您还必须保持唯一性,以免覆盖所需的数据。
在您的情况下,一个很好的可视化方法如下:
- 每个艺术家都是独一无二的(在我看来,艺术家就像一个很好的分区键)
- 每个艺术家都可以拥有多个专辑,这使得这是一个很好的排序键(在您要搜索已知艺术家的专辑的情况下)
在上述情况下,您的排序键正在与您的分区键组合以根据以下答案创建您的哈希键(值得一读!),以便您编写一个查询,其中您知道艺术家但只有部分标题。
即。这里的艺术家 = "Pink Floyd" QUERY 其中字符串专辑包含 "Moon"
这将匹配“粉红弗洛伊德”月球的黑暗面。
话虽这么说,你只会有一个 Pink Floyd 的“价格” - 月亮的黑暗面,因为分区键和排序键结合起来处理唯一性。当您使用第二个价格更新条目时,您将覆盖现有对象。
所以真正的问题是,最适合我的用例的排序键是什么?
要回答这个问题,您需要在构建系统之前知道最常见的查询是什么。
基于价格的查询?
在您的问题中,您提到价格属性是在您似乎知道艺术家和专辑的情况下。
“author=a”、“album=b”、“startDated”和“price is between e and f”,按价格排序
对我来说,在这种情况下,您可能不知道艺术家,或者如果您知道,您可能不知道专辑,因为您可能希望编写一个查询来返回来自多个艺术家的专辑或至少来自同一位艺术家。
但是
如果您创建的数据库包含多个条目(例如来自多个以不同价格销售同一艺术家/专辑的供应商),则情况可能并非如此。在这种情况下,我会说最简单的方法是在给定的价格(排序键)下仅存储一个艺术家专辑(分区键)的条目,但您将丢失与艺术家专辑相同价格的所有其他条目。
多个查询可能需要多个表
我有一个类似的用例,最终需要创建多个表来处理我的查询。数据从一个表传递/处理,并使用在插入时触发的 Lambda 吐出到另一个表中。然后我向一个表发送一些查询,向初始表发送一些其他查询。