DynamoDB - 关联表 - 多对多关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DynamoDB - 关联表 - 多对多关系相关的知识,希望对你有一定的参考价值。

我在DynamoDb中有一个场景,其中记录具有多对多关系。

在SQL中,通常我会创建一个关联表来将记录分成一对多的关系。

例如:

  1. 故事可以有多个位置
  2. 地点有多个故事

这是一个示例记录:

{
  "storyId": "asd239ruefjsp32wf",
  "name": "Donut store",
  "locations": [
    {
      "locationId": "asdas23r23",
      "name": "New South Whales",
      "abbreviation": "NSW"
    },
    {
      "locationId": "sdgkhsdf98",
      "name": "Queensland",
      "abbreviation": "QLD"
    }
  ]
}

这可能分为3个表:

故事

  • storyId
  • 地点

地点

  • locationId

StoriesLocations(使用GSI - partitionKey = locationId)

  • storyLocationId
  • storyId
  • locationId

我的大问题是,用户可以使用多个locationId搜索故事。

GET /stories?locations=sdgkhsdf98,asdas23r23

分别使用每个storyId查询StoriesLocations GSI似乎不是一个好的解决方案,特别是如果我必须获得所有的故事数据并管理分页。

目前只有1个国家,有7个地点。因此,只会搜索少数几个位置。

有更有效的方式存储数据吗?甚至查询它?

我之所以选择DynamoDB,是因为它的速度很快,而且通常我会进行开发。所以建立一个我没有多少经验的SQL数据库。我还将使用Appsync的实时聊天定位器,默认情况下使用DynamoDB。

答案

我认为只有1个表和1个本地二级索引(LSI)即。您的方案中需要故事和位置作为故事表的本地二级索引(LSI)。 Stories表使用storyId作为其Hash/partition Key和位置作为其Sort/range Key。对于LSI,您可以使用位置作为排序键,并在LSI中投影您需要的任何Stories表的属性,因为您可以稍后查询它。有关DyamoDB LSI和排序键的更多信息

Look here for more details

Stories
HK storyId
SK locations
name
...


(LSI) storiesLocationsIndex
SK locations
name
...

希望这可以帮助

以上是关于DynamoDB - 关联表 - 多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

“关联表”(多对多关系)的正确名称是啥[关闭]

Flask/SQLAlchemy - 多对多关系的关联模型和关联表之间的区别?

hibernate关联关系(多对多)

如何在 DynamoDB 中建模一对一、一对多和多对多关系

Hibernate学习笔记 --- 创建基于中间关联表的多对多映射关系

mybatis11--多对多关联查询