DynamoDb多对多更新复制数据



我正在创建一个存储书签的应用程序,每个书签可能有许多标签。我是NoSQL数据库的新手,不知道如何构建我的表。现在我有以下模型:

PK        SK           data
USER#1    USER         some data
USER#1    BOOKMARK#1   bookmarkDetails 
USER#1    LABLE#1      labelDetails
LABEL#1   BOOKMARK#1   bookmarkDetails

有了它,我可以查询所有用户书签和所有用户标签。但是我需要在书签中存储分配标签的详细信息,例如包括标题和颜色。但是,当我想更新标签的细节并更改名称时,会发生什么呢?我应该遍历所有书签并更新标签的标题吗?在DynamoDb的情况下,这意味着我需要发送许多请求来获取我需要更新的书签,然后发送更新请求。

是否可以将分配给书签的标签存储在bookmarkDetails中?并将具有给定标签的书签存储在labelDetails中? 如果我更改标签的标题或书签的标题,这将导致需要更新许多行。从RDS世界来看,这似乎是压倒性的和巨大的发展努力。还有别的方法来表示多对多关系吗?在这种情况下,我需要能够按标签获取所有书签,这就是为什么我遵循这种方法。

编辑:我正在添加访问模式,我需要在这里更清楚。

Entities:
User: ID and email
Bookmark: ID and url
Label: ID and title
Relations: 
User to Bookmark = OneToMany
Bookmark to Label = ManyToMany 
  1. 根据用户ID获取所有书签-包括附加到给定书签的所有标签的详细信息
  2. 根据用户ID获取所有标签
  3. 根据标签ID获取所有书签-包括所有附加到给定书签的标签信息

更新动作是能够改变标签标题和书签url

将标签数据存储在bookmarkDetails中,而将书签数据存储在labelDetails中会使解决方案复杂化。最好将书签和标签的详细信息分离到单独的表中,而将label-bookmark-user的映射保留在一个表中。

以下解决方案是否有效将取决于您拥有的不同书签的数量,不同标签的数量,不同用户的数量,每个用户的书签数量和每个书签的标签数量。

表1:Bookmark Details

PK 
----------
BookmarkID     BookMarkDetails (Name, title etc)

表2:Label Details

PK
-------
LabelID     LabelDetails (Name, title etc)

表3:UserBookmarkLabelMapping

PK                    SK        
-----------------  --------
UserID#BookmarkID   LabelID(GSI)    UserID (GSI)    BookmarkID (GSI)

写操作

  1. Bookmark Details Update:将在表1中做一次写入。
  2. 标签细节更新:将在表2中做一次写入。
  3. 为用户创建新标签/删除标签/修改书签标签:表3中一次写。

读取操作

  1. 获取所有用户书签:
  • UserID-GSI查询。1个Read操作
  • 从表1中获取所有bookmarkIDs的详细信息。一次BatchGet操作(if <每个用户100个书签)否则多个BatchGet操作并行>
  1. 获取所有用户标签:同上

  2. 获取标签的所有书签。

  • 查询LabelID-GSI获取所有BookmarkIds。一次读操作。
  • 从表1中获取所有bookmarkid的详细信息。一次BatchGet操作(if <每个标签100个书签),否则多个BatchGet操作并行。>

缺点是,与关系世界不同,我们将运行两个顺序查询—一个获取id,另一个获取这些id的详细信息。如果不同书签/标签的数量很少,可以克服这个问题,我们可以将这些数据缓存到内存中。或者如果你正在使用DynamoDB,那么也许可以使用像DAX这样的东西来加速getBookmarkDetails, getLabelDetails调用。

相关内容

  • 没有找到相关文章