从关系数据库背景来看,我发现有时候找到构建我的NoSQL数据库的正确方法是一个挑战(是的,我意识到这个声明听起来很愚蠢)。我使用DynamoDB。
如果我有3个实体 - 用户,报告和建筑物,并且许多用户可以在建筑物上提交许多报告,那么以下结构是否可以接受?
User - index on userId
Building - index on buildingId
Report - index on reportId, userId and buildingId
或者我是否需要第四张表来跟踪用户提交的报告?我关注的是性能,吞吐量和存储空间。
答案 0 :(得分:1)
使用DynamoDB时,global secondary indexes提供了从表中查询数据的替代方法。
根据您在此处描述的表格,结构可能有效:
用户表
构建表
报告表
上述设计的关键是Report表上的全局二级索引。与主表上的散列键(和可选范围键)不同,GSI上的散列键(和可选范围键)不必是唯一的。这意味着您可以查询特定userId提交的所有报告或特定buildingId的所有报告。
在现实生活中,这些GSI可能希望包含一个Range键(例如日期),以便在查询记录时对其进行排序。
要记住关于GSI的另一件事是,您需要选择能够检索哪些属性,因为GSI实际上是数据的物理副本。这也意味着GSI始终异步更新,因此读取总是最终一致。