angularjs - AngularFire - 如何查询非规范化数据?

标签 angularjs nosql firebase angularfire denormalization

好的,我刚开始使用 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 和工具来协助)的计划,但你目前的主要武器是适当的数据结构。

首先,让我们处理树层次结构与非规范化数据。这里有一些你应该非规范化的事情:

  • 列出您希望能够快速迭代的列表(用户名列表,无需下载用户曾经写过的每条消息或有关用户的所有其他元信息)
  • 您查看部分的大型数据集,例如用户所属的房间/组列表(您应该能够获取给定用户的房间列表,而无需下载系统中的所有组/房间,因此将索引一个地方,其他地方的主房间数据)
  • 超过 1,000 条记录的任何内容(保持精简以提高速度)
  • 包含 1..n(即可能无限)记录的路径下的子项(来自聊天室元数据的聊天消息示例,这样您就可以在不获取所有消息的情况下获取有关聊天室的信息)

  • 以下是一些非规范化可能没有意义的事情:
  • 数据,你总是取到全部,从不迭代(如果你总是使用 .child(...).on('value', ...) 来获取一些记录,并且显示该记录中的所有内容,从不引用父列表,则没有理由优化可迭代性)
  • 列出短于一百条左右的记录,您总是作为一个整体(例如,用户所属的组列表可能总是与该用户一起获取,平均为 5-10 个项目;可能没有理由将其分开)

  • 获取作者就像在 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/

    相关文章:

    javascript - 如何在 THREE.js 上更改参数时自动更新网格

    javascript - AngularJS 中的复选框不会触发 onChange 事件

    javascript - 如何使用 AngularJS 处理文档点击并通知其他 Controller ?

    java - 为什么无法从 firebase 扫描数据

    html - 在 ionic 框架中将搜索输入保持在 ListView 的顶部

    database-design - 让应用程序通过 REST Api 直接访问 CouchDB 是否安全?

    database - 如何从 redis 集中检索 id 的内容

    nosql - redis中的主从交互

    java - Firebase 与 Room 持久性库

    java - 如何从 Cloud Firestore 获取一组数据?