【问题标题】:DynamoDb many to many update replicated dataDynamoDb 多对多更新复制数据
【发布时间】:2021-03-12 23:21:49
【问题描述】:

我正在创建一个应用程序来存储书签,每个书签可能有很多标签。我是 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 获取所有书签 - 包括有关附加到给定书签的所有标签的信息

并且更新操作是能够更改标签标题和书签网址

【问题讨论】:

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

标签: nosql amazon-dynamodb


【解决方案1】:

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

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

表 1:书签详情

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

表 2:标签详情

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

表 3:用户书签标签映射

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

写操作

  1. 书签详细信息更新:将在表 1 中进行一次写入。
  2. 标签详细信息更新:将在表 2 中进行一次写入。
  3. 为用户创建新标签/删除标签/修改书签标签:在表 3 中写入。

读取操作

  1. 获取所有用户书签:
  • 查询 UserID-GSI。一次读取操作。
  • 从表 1 中获取所有书签 ID 的详细信息。一个 BatchGet 操作(如果每个用户
  1. 获取所有用户标签: 同上。

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

  • 查询 LabelID-GSI 以获取所有 BookmarkId。一次读取操作。
  • 从表 1 中获取所有这些 bookmarkId 的详细信息。一个 BatchGet 操作(如果每个标签

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

【讨论】:

  • 为什么要在解决方案中使用多个表?
猜你喜欢
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2021-07-10
  • 1970-01-01
  • 2020-01-02
相关资源
最近更新 更多