如何解决DynamoDB朋友查询
我与用户和朋友一起拥有DynamoDB表。这里的用户1(tom)和用户2(rob)是朋友。
+--------+---------+----------+
| PK | SK | UserName |
+--------+---------+----------+
| USER#1 | USER#1 | tom |
| USER#2 | USER#2 | bob |
| USER#3 | USER#3 | rob |
| FRD#1 | USER#2 | |
| FRD#2 | USER#1 | |
+--------+---------+----------+
- 是否可以在单个查询中获得用户1(tom)的朋友的名字?
- 如果不是有效的查询方式,则
任何帮助将不胜感激。
我目前正在做的是:
第1步:获取用户1的所有朋友。
let frdParams = {
TableName : "TABLE_NAME",IndexName: "SK-PK-index",KeyConditionExpression: "SK = :userId AND begins_with(PK,:friend)",ExpressionAttributeValues: {
":userId": {S: userId},":friend": {S: "FRIEND#"}
}
};
const frdRes = await ddb.query(frdParams).promise();
第2步:一旦获得所有用户,便会循环运行更多查询。
for (const record of frdRes.Items) {
let recordX = aws.DynamoDB.Converter.unmarshall(record);
let friendId = itemX.PK.replace("FRD","USER")
let userParams = {
TableName : "TABLE_NAME",KeyConditionExpression: "PK = :userId AND SK = :userId",ExpressionAttributeValues: {
":userId": {S: friendId}
}
};
const userRes = await ddb.query(userParams).promise();
}
解决方法
与使用SQL数据库时,DynamoDB中的数据建模所需的思维方式不同。为了充分利用DynamoDB,您需要考虑应用程序访问模式并以支持这些用例的方式存储数据。
听起来您的访问模式是“通过用户ID提取朋友”。有很多方法可以实现这种访问模式,但是我将为您提供一些有关如何实现它的想法。
想法1:对数据进行非规范化
您可以创建一个list
属性并存储每个用户的朋友列表。这将使按用户获取朋友变得非常简单!
与任何访问模式一样,此方法也有局限性。 DynamoDB属性的最大大小为400KB,因此您仅限于该大小的好友列表。另外,您将无法基于此属性的值执行查询,因此它将不支持其他访问模式。但是,这非常简单!
想法2:构建一个项目集合,将朋友存储在USER#<id>
分区中。
这是代表DynamoDB中一对多关系的典型模式。假设您以PK USER#<user_id>
和SK FRIEND#<friend_id>
来定义友谊。您的表格如下所示:
您可以通过在用户分区键中搜索begins_with
朋友的排序键来获取给定用户的朋友。
这只是两个想法,在DynamoDB中建模友谊的方法更多(可能更好)。我提供的示例将这种关系视为一对多(一个用户有很多朋友)。更有可能的是,您要建立多对多的关系,这在DynamoDB中非常棘手(以及另一个主题!)
如果听起来像您拥有的多对多,则AWS具有article describing modeling many-to-many关系,这可能是一个很好的起点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。