Amazon DynamoDB (NoSQL db) 一对多关系

Amazon DynamoDB (NoSQL db) one-to-many relationship

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

我成功创建了一个 DynamoDB table "Post" 散列 "_id":

{
 "_id":"1"
}

and table "Comment" with hash "_id" and range "post_id":

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

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

  1. 获取Post
  2. 使用 post_id
  3. 获取评论
  4. 使用评论模型构建 Post 并 return 它

一对多关系的设计是否有效?

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

您可以尝试通过在您的评论 table 上创建一个 GSI(全球二级索引)来缓解这种情况,并在 post_id.

上创建一个分区键

另一种选择是将评论中的散列键 table 设为 post_id 并将范围键设为 comment_idtimestamp.

希望这对您有所帮助,但如果您仍有疑问,我鼓励您通过 Forums.

联系亚马逊客户支持

正如我所承诺的那样,post使用我的 lambda 函数来获取您的 post 的 "relation"。它实例化一个 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);
      }
  }
}