用于查找属性包含特定值的项目的 DynamoDB 索引设计

问题描述 投票:0回答:1

问题

我目前正在为一个软件应用程序设计数据库,多个组织将使用该数据库来管理多个项目。我计划使用 DynamoDB 作为数据库。我的问题集中在我需要在“项目”表上执行的一个查询。我需要执行的查询如下:

  1. 按organization_id查找项目。
  2. 通过id查找项目。
  3. 按状态查找项目。
  4. 查找成员的项目。

注意:每个项目实体都会有一个organization_id、id、status 和成员数组(用户id)。

我试图解决的问题是查询#4。每个项目可以有多个成员,当用户登录到他们的仪表板时,我只想获取并显示该用户所属的项目。问题在于项目实体中的“成员”字段是一个带有用户 ID 的数组,这意味着一个项目的“成员”可能与另一个项目相同,这意味着它不能保证唯一性。

我将用于该表的索引之一将使用organization_id作为分区键,使用id作为排序键。我想对将用于查询 #4 的索引执行类似的操作,但由于“members”在其分区中不是唯一的,因此我无法将其用作排序键。

可能的解决方案

1 - 用户到项目表

这个解决方案需要我创建一个额外的表。该表将每个用户 ID 与项目 ID 数组相关联。当用户加载他们的仪表板时,我可以获取该表的用户条目并执行批量项目请求,并通过数组中的 ID 获取所有项目。

优点:

  • 比使用过滤表达式的查询开销更低(我认为)。

缺点:

  • 需要整张额外的桌子。
  • 在项目中添加/删除用户时更新多个表变得更加复杂。
  • 将需要批量项目请求才能通过 ID 获取多个项目,从而增加所需的处理。

2 - 使用过滤表达式查询

对于此解决方案,我将使用organization_id作为分区键进行查询,并设置过滤器来查找“成员”包含我正在查找的用户id的项目。

优点:

  • 无需额外的桌子。

缺点:

  • 过滤器表达式仅在进行基本查询后应用,这意味着无论是否应用过滤器,查询都将具有相同的开销。对于向此端点发出的每个请求,我基本上都会获取具有特定organization_id的所有项目,然后过滤它们以找到正确的项目(效率不高)。
  • 按照上一点,查询最多仅返回 1MB 的数据。由于过滤器是在原始查询之后应用的,这意味着如果组织中的项目总数超过每个请求 1MB 的限制,那么即使在过滤器表达式之后存在匹配的项目,我也无法从查询中收到任何返回信息。数据库,这意味着我必须执行另一个分页请求,直到找到它。

3 - 其他

我希望存在另一种解决方案,我可以执行单个请求并获取我需要的所有数据。我认为 Z-index 是一种可能的解决方案,但尚未完全找出使用它的最佳方法。

感谢任何帮助

有人遇到过这样的问题吗?我知道这是一个常见的数据模型,所以我想一定有一个很好的方法来做到这一点,但我一直无法找到一种看起来最佳的方法。欢迎所有评论。预先感谢!

amazon-web-services database-design amazon-dynamodb nosql dynamodb-queries
1个回答
0
投票

通常您会像下面这样进行映射:

PK SK 数据
项目123 项目123 所有项目数据
项目123 用户001 该项目的任何特定用户数据
项目123 用户002 该项目的任何特定用户数据
项目123 用户099 该项目的任何特定用户数据

然后您可以创建一个以 SK 作为分区键的 GSI,这将为您提供与用户相关的所有项目。然后您可以执行 BatchGetItem 从基表中获取所有项目元数据

© www.soinside.com 2019 - 2024. All rights reserved.