来自关系数据库背景,我发现有时找到构建NoSQL数据库的正确方法是一个挑战(是的,我意识到这句话听起来很傻)。我使用DynamoDB。
如果我有3个实体-一个用户,一个报告和一个建筑物,许多用户可以提交许多关于建筑物的报告,下面的结构可以接受吗?
User - index on userId
Building - index on buildingId
Report - index on reportId, userId and buildingId
还是需要第四个表来跟踪用户提交的报告?我关心的是性能、吞吐量和存储空间。
当使用DynamoDB时,全局二级索引提供了从表中查询数据的替代方法。
根据你所描述的表格,这里有一个可以工作的结构:
用户表
- 哈希键:userId
建筑表/strong>
- 哈希键:buildingId
报告表/strong>
- Hash Key: reporttid
- ReportUser GSI
- 哈希键:userId
- BuildingUser GSI
- 哈希键:buildingId
上述设计的关键是Report表上的全局二级索引。与主表上的散列键(和可选范围键)不同,GSI上的散列键(和可选范围键)不必是唯一的。这意味着您可以查询特定userId提交的所有报告,也可以查询特定buildingId提交的所有报告。
在现实生活中,这些gsi可能希望包含一个Range键(例如date),以便在查询记录时对它们进行排序。
关于GSI要记住的另一件事是,您需要选择哪些属性是投影的,能够被检索的,因为GSI实际上是数据的物理副本。这也意味着GSI总是异步更新,因此读取总是最终一致的。