Nosql DynamoDb多对多更新复制数据

Nosql DynamoDb多对多更新复制数据,nosql,amazon-dynamodb,Nosql,Amazon 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 有了它,我可以

我正在创建一个应用程序来存储书签,每个书签可能都有许多标签。我是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,这意味着我需要发送许多请求来获取需要更新的书签,然后发送更新请求

是否可以将指定给书签的标签存储在书签详细信息中,并将具有给定标签的书签存储在labelDetails中?如果我更改标签的标题或书签的标题,这将导致需要更新许多行。来自RDS世界,这似乎是压倒性的巨大开发工作。有没有其他方法来表示多人关系?在这种情况下,我需要能够按标签获取所有书签,这就是为什么我采用这种方法

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

Entities:
User: ID and email
Bookmark: ID and url
Label: ID and title

Relations: 
User to Bookmark = OneToMany
Bookmark to Label = ManyToMany 
  • 按用户ID获取所有书签-包括附加到给定书签的所有标签的详细信息
  • 按用户ID获取所有标签
  • 按标签ID获取所有书签-包括有关附加到给定书签的所有标签的信息

  • 更新操作能够更改标签标题和书签url

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

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

    表1:书签详细信息

    PK 
    ----------
    BookmarkID     BookMarkDetails (Name, title etc)
    
    PK
    -------
    LabelID     LabelDetails (Name, title etc)
    
    表2:标签详细信息

    PK 
    ----------
    BookmarkID     BookMarkDetails (Name, title etc)
    
    PK
    -------
    LabelID     LabelDetails (Name, title etc)
    
    表3:UserBookmarkLabelMapping

    PK                    SK        
    -----------------  --------
    UserID#BookmarkID   LabelID(GSI)    UserID (GSI)    BookmarkID (GSI)
    
    写入操作

    PK 
    ----------
    BookmarkID     BookMarkDetails (Name, title etc)
    
    PK
    -------
    LabelID     LabelDetails (Name, title etc)
    
  • 书签详细信息更新:将在表1中进行一次写入
  • 标签详细信息更新:将在表2中进行一次写入
  • 为用户创建新标签/删除标签/修改书签标签:在表3中写入一项
  • 读取操作

    PK 
    ----------
    BookmarkID     BookMarkDetails (Name, title etc)
    
    PK
    -------
    LabelID     LabelDetails (Name, title etc)
    
  • 获取所有用户书签:
    • 查询用户ID GSI。一次读取操作
    • 从表1中获取所有书签ID的详细信息。一个BatchGet操作(如果每个用户<100个书签),否则并行执行多个BatchGet操作
  • 获取所有用户标签: 同上

  • 获取标签的所有书签

    • 查询LabelID GSI以获取所有书签ID。一次读取操作
    • 从表1中获取所有这些书签ID的详细信息。一个BatchGet操作(如果每个标签<100个书签),否则并行执行多个BatchGet操作

    缺点是,与关系世界不同,我们将运行两个顺序查询——一个用于获取ID,另一个用于获取这些ID的详细信息。如果不同书签/标签的数量很小,这是可以克服的,我们可以将这些数据缓存在内存中。或者,如果您使用的是DynamoDB,那么可以使用DAX之类的工具来加速getBookmarkDetails、getLabelDetails调用。

    通过定义应用程序中的实体:用户、书签和标签,您已经有了一个很好的开端。下一步是明确定义应用程序需要支持的访问模式(例如,按用户ID获取书签)。我不清楚你的访问模式是什么,你能澄清一下吗?你想对用户、书签和标签做什么?@SethGeoghegan谢谢,我添加了访问模式。我觉得Sarthak Jain提出的解决方案是在应用程序级别复制RDS,而不是NoSQL方法。为什么在解决方案中使用多个表?