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 进行两次查询:
- 获取Post
- 使用 post_id
获取评论
- 使用评论模型构建 Post 并 return 它
一对多关系的设计是否有效?
在您的设计中,您将 运行 遇到的一个问题是查询 post_id
的评论 table 的能力。 DynamoDB 要求您在进行查询时提供哈希键值,因此在关系数据库中一些微不足道的事情,例如连接,实际上在 DynamoDB 中变得相当困难。
您可以尝试通过在您的评论 table 上创建一个 GSI(全球二级索引)来缓解这种情况,并在 post_id
.
上创建一个分区键
另一种选择是将评论中的散列键 table 设为 post_id
并将范围键设为 comment_id
或 timestamp
.
希望这对您有所帮助,但如果您仍有疑问,我鼓励您通过 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);
}
}
}
自从 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 进行两次查询:
- 获取Post
- 使用 post_id 获取评论
- 使用评论模型构建 Post 并 return 它
一对多关系的设计是否有效?
在您的设计中,您将 运行 遇到的一个问题是查询 post_id
的评论 table 的能力。 DynamoDB 要求您在进行查询时提供哈希键值,因此在关系数据库中一些微不足道的事情,例如连接,实际上在 DynamoDB 中变得相当困难。
您可以尝试通过在您的评论 table 上创建一个 GSI(全球二级索引)来缓解这种情况,并在 post_id
.
另一种选择是将评论中的散列键 table 设为 post_id
并将范围键设为 comment_id
或 timestamp
.
希望这对您有所帮助,但如果您仍有疑问,我鼓励您通过 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);
}
}
}