好的我开始使用Firebase。我已经读过这个:https://www.firebase.com/docs/data-structure.html我已经读过这个:https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html
所以我很困惑,因为一个人似乎与另一个相矛盾。您可以按层次结构化数据,但如果您希望它可扩展,那么就不要这样做。然而,这不是实际问题。
对于博客引擎,我有以下结构(请纠正我,如果这是错误的):
"authors" : {
"-JHvwkE8jHuhevZYrj3O" : {
"userUid" : "simplelogin:7",
"email" : "myemail@domain.com"
}
},
"posts" : {
"-JHvwkJ3ZOZAnTenIQFy" : {
"state" : "draft",
"body" : "This is my first post",
"title" : "My first blog",
"authorId" : "-JHvwkE8jHuhevZYrj3O"
}
}
作者列表和帖子列表。首先,我想让作者在userUid
等于我当前用户uid
的位置。然后我想获得authorId
是查询提供的帖子。
但我不知道该怎么做。任何帮助,将不胜感激!如果这会产生影响,我会使用AngularFire。
答案 0 :(得分:5)
Firebase是NoSQL数据存储。它是一个JSON层次结构,并且没有传统意义上的SQL查询(这些查询与闪电般快速的实时操作不兼容;它们往往是缓慢而昂贵的)。有一些地图缩减样式功能的计划(合并视图和工具来协助这个),但目前你的主要武器是正确的数据结构。
首先,让我们解决树层次结构与非规范化数据的问题。以下是你应该反规范化的一些事情:
以下是反规范化可能没有意义的一些事情:
.child(...).on('value', ...)
来获取某些记录并且您显示该记录中的所有内容,从不引用父列表,则没有理由优化迭代)< / LI>
获取作者就像将ID添加到URL一样简单:
var userId = 123;
new Firebase('https://INSTANCE.firebaseio.com/users/'+userId);
要获取属于特定用户的帖子列表,请维护该用户帖子的索引:
/posts/$post_id/...
/my_posts/$user_id/$post_id/true
var fb = new Firebase('https://INSTANCE.firebaseio.com');
fb.child('/my_posts/'+userId).on('child_added', function(indexSnap) {
fb.child('posts/'+indexSnap.name()).once('value', function(dataSnap) {
console.log('fetched post', indexSnap.name(), dataSnap.val());
});
});
像Firebase.util这样的工具可以协助规范分割存储的数据,直到Firebase的视图和高级查询工具被释放为止:
/posts/$post_id/...
/my_posts/$user_id/$post_id/true
var fb = new Firebase('https://INSTANCE.firebaseio.com');
var ref = Firebase.util.intersection( fb.child('my_posts/'+userId), fb.child('posts') );
ref.on('child_added', function(snap) {
console.log('fetched post', snap.name(), snap.val();
});
或者只是按用户ID存储帖子(取决于您以后如何获取数据的用例):
/posts/$user_id/$post_id/...
new Firebase('https://INSTANCE.firebaseio.com/posts/'+userId).on('child_added', function(snap) {
console.log('fetched post', snap.name(), snap.val());
});