【问题标题】:DynamoDB - Associative table - Many to Many relationshipDynamoDB - 关联表 - 多对多关系
【发布时间】:2018-09-01 20:18:56
【问题描述】:

我在 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 个表格:

故事

  • 故事 ID
  • 位置

地点

  • 位置标识

StoriesLocations(使用 GSI - partitionKey = locationId)

  • storyLocationId
  • 故事 ID
  • 位置标识

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

GET /stories?locations=sdgkhsdf98,asdas23r23

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

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

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

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

【问题讨论】:

    标签: nosql amazon-dynamodb


    【解决方案1】:

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

    Look here for more details.

    Stories
    HK storyId
    SK locations
    name
    ...
    
    
    (LSI) storiesLocationsIndex
    SK locations
    name
    ...
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2020-04-18
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多