我尝试学习 DynamoDB 只是为了教学目的,因此我建议自己创建一个小项目来销售车辆(汽车、自行车、四轮摩托车等),以便学习并获得一些使用 NoSQL 数据库的经验。我阅读了很多关于创建正确模型的文档,但我仍然无法找出存储数据的最佳方式。
我想通过以下过滤器获取所有车辆:
- 获得所有不超过 3 个月的汽车。
- 按品牌、年份和型号获取所有不超过 3 个月的汽车。
- 依此类推,之前对自行车、四轮摩托车等的查询也是如此。
在阅读了带有示例的官方文档和其他页面后(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-general-nosql-design.html#bp-general-nosql-design-approach,https ://medium.com/swlh/data-modeling-in-aws-dynamodb-dcec6798e955,单独的表与地图列表 - DynamoDB),他们说最好的设计只使用一个表来存储所有内容,所以我最终得到一个模型如下:
-------------------------------------------------------------------------------------
Partition key | Sort key | Specific attributes for each type of vehicle
-------------------------------------------------------------------------------------
cars | date#brand#year#model | {main attributes for the car}
bikes | date#brand#year#model | {main attributes for the bike}
-------------------------------------------------------------------------------------
我使用了复合排序键,因为他们指定这是搜索数据的好习惯(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-sort-keys.html)。
但是在定义我的模型之后,我最终发现以前的模型会有一个称为“热点”或“霍伊键”的问题。(https://medium.com/expedia-group-tech/dynamodb-data-modeling-c4b02729ac08,https://dzone.com/articles/partitioning-behavior-of-dynamodb)因为在官方文档中他们建议使用分区具有高基数的键来避免该问题。
所以在这一点上,我对如何定义一个好的和可扩展的模型有点困惑。您能否为我提供一些有关如何实现模型以获取上述查询的帮助或示例?
注意:我还考虑为每辆车创建一个特定的表,但这会产生更多问题,因为要找到执行全表扫描所需的信息。