我目前正在为一个软件应用程序设计数据库,多个组织将使用该数据库来管理多个项目。我计划使用 DynamoDB 作为数据库。我的问题集中在我需要在“项目”表上执行的一个查询。我需要执行的查询如下:
注意:每个项目实体都会有一个organization_id、id、status 和成员数组(用户id)。
我试图解决的问题是查询#4。每个项目可以有多个成员,当用户登录到他们的仪表板时,我只想获取并显示该用户所属的项目。问题在于项目实体中的“成员”字段是一个带有用户 ID 的数组,这意味着一个项目的“成员”可能与另一个项目相同,这意味着它不能保证唯一性。
我将用于该表的索引之一将使用organization_id作为分区键,使用id作为排序键。我想对将用于查询 #4 的索引执行类似的操作,但由于“members”在其分区中不是唯一的,因此我无法将其用作排序键。
这个解决方案需要我创建一个额外的表。该表将每个用户 ID 与项目 ID 数组相关联。当用户加载他们的仪表板时,我可以获取该表的用户条目并执行批量项目请求,并通过数组中的 ID 获取所有项目。
对于此解决方案,我将使用organization_id作为分区键进行查询,并设置过滤器来查找“成员”包含我正在查找的用户id的项目。
我希望存在另一种解决方案,我可以执行单个请求并获取我需要的所有数据。我认为 Z-index 是一种可能的解决方案,但尚未完全找出使用它的最佳方法。
有人遇到过这样的问题吗?我知道这是一个常见的数据模型,所以我想一定有一个很好的方法来做到这一点,但我一直无法找到一种看起来最佳的方法。欢迎所有评论。预先感谢!
通常您会像下面这样进行映射:
PK | SK | 数据 |
---|---|---|
项目123 | 项目123 | 所有项目数据 |
项目123 | 用户001 | 该项目的任何特定用户数据 |
项目123 | 用户002 | 该项目的任何特定用户数据 |
项目123 | 用户099 | 该项目的任何特定用户数据 |
然后您可以创建一个以 SK 作为分区键的 GSI,这将为您提供与用户相关的所有项目。然后您可以执行 BatchGetItem 从基表中获取所有项目元数据