DynamoDB-关联表-多对多关系

时间:2018-09-01 08:51:29

标签: nosql amazon-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 个答案:

答案 0 :(得分:1)

我认为只有1个表和1个本地二级索引(LSI),即在您的方案中,需要故事和位置作为故事表的本地二级索引(LSI)。 “故事”表使用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
...

希望这会有所帮助