Amazon DynamoDB(NoSQL db)一对多关系

时间:2016-03-30 09:19:49

标签: amazon-web-services parse-platform amazon-dynamodb aws-lambda

自从Parse.com服务宣布关闭后,我决定使用Amazon Web Services重建我的应用程序。据我所知,Parse使用NoSQL(MongoDB)数据库,我能够在Parse仪表板中设置一对多的关系。

我成功创建了一个带有哈希"Post"

的DynamoDB表"_id"
{
 "_id":"1"
}

和表格"Comment"包含哈希"_id"和范围"post_id"

{
 "_id":"1",
 "post_id":"1",
 "text":"my comment"
}

现在,我想获取帖子_id = 1以及与此帖相关的所有评论。实现这个的基本方法是什么?我想定义一个Lambda函数,它将对DynamoDB进行两次查询:

  1. 获取帖子
  2. 使用post_id
  3. 获取评论
  4. 使用注释模型构建帖子并将其返回
  5. 设计一对多关系是否有效?

2 个答案:

答案 0 :(得分:1)

根据您的设计,您将遇到的一个问题是能够通过post_id查询评论表。 DynamoDB要求您在进行查询时提供哈希键值,因此使用DynamoDB实际上在关系数据库(例如连接)中微不足道的事情变得相当困难。

您尝试缓解此问题的一种方法是在评论表上创建GSI(全局二级索引),并在post_id上创建分区键。

另一个选项是使评论表中的哈希键为post_id,范围键为comment_idtimestamp

我希望这会有所帮助,但如果您仍有疑问,我建议您通过Forums.

与亚马逊客户支持联系

答案 1 :(得分:0)

正如我所承诺的,发布我的lambda函数来获取"关系"你的帖子。它实例化一个dynamodb实例,并使用您提供的参数进行查询。简而言之,您需要在ExpressionAttributeValues post_id中提供您感兴趣的评论。

var AWS = require('aws-sdk');

exports.handler = (event, context, callback) => {
  var dynamodb = new AWS.DynamoDB();    
  var comment_params = {
      "TableName": "YOUR_TABLE_NAME",
      "Select":"ALL_ATTRIBUTES",
      "IndexName": "YOUR_GLOBAL_INDEX",
      "Limit": 10,
      "ConsistentRead": false,
      "KeyConditionExpression": "#post_id = :v1",
      "ExpressionAttributeValues": {
          ":v1": {"S": "POST_ID"}
      },
      "ExpressionAttributeNames": {"#post_id": "post_id"},
      "ReturnConsumedCapacity": "TOTAL"
  }

  dynamodb.query(comment_params, function(err, data) {
      if (err) {
            return callback(err);
      } else {
          var comment_items = data.Items;
            return callback(null, comment_items);
      }
  }
}