好的,我刚开始使用 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。
最佳答案
Firebase 是一种 NoSQL 数据存储。它是一个 JSON 层次结构,没有传统意义上的 SQL 查询(这些与闪电般快速的实时操作并不真正兼容;它们往往既慢又昂贵)。有一些 map reduce 风格的功能(合并 View 和工具来协助)的计划,但你目前的主要武器是适当的数据结构。
首先,让我们处理树层次结构与非规范化数据。这里有一些你应该非规范化的事情:
以下是一些非规范化可能没有意义的事情:
.child(...).on('value', ...)
来获取一些记录,并且显示该记录中的所有内容,从不引用父列表,则没有理由优化可迭代性)获取作者就像在 URL 中添加 id 一样简单:
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 的 View 和高级查询实用程序发布:
/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());
});
关于angularjs - AngularFire - 如何查询非规范化数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22392765/