当前位置: 首页 > 面试题库 >

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

景品
2023-03-14
问题内容

好的,我刚开始使用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"
  }
}

作者列表和帖子列表。首先,我想让Author userUid等于我当前用户的uid。然后,我想获得的职位authorId是提供给查询的职位。

但是我不知道该怎么做。任何帮助,将不胜感激!如果这有所作为,我正在使用AngularFire。


问题答案:

Firebase是NoSQL数据存储。这是一个JSON层次结构,没有传统意义上的SQL查询(这些查询与快如闪电的实时操作并不真正兼容;它们往往很慢且昂贵)。已经计划了一些地图精简样式功能(合并的视图和工具来辅助此功能),但是目前您的主要武器是适当的数据结构。

首先,让我们解决树层次结构与非规范化数据之间的关系。您应该对以下几项进行非规范化:

  • 想要快速迭代的列表(无需下载用户曾经写过的每条消息或有关该用户的所有其他元信息的用户名列表)
  • 查看部分数据的大数据集,例如用户所属的房间/组的列表(您应该能够为给定的用户获取房间的列表,而无需下载系统中的所有组/房间,因此请放置索引一个地方,母室数据在其他地方)
  • 记录超过1000条的内容(保持速度)
  • 包含1..n(即,可能是无限个)记录的路径下的子对象(例如,来自聊天室元数据的聊天消息,这样您就可以获取有关聊天室的信息而无需获取所有消息)

以下是一些可能无法正常化的事情:

  • 您始终会获取并永不迭代的数据(如果您始终用于.child(...).on('value', ...)获取某些记录,并且显示该记录中的所有内容,而从未引用父列表,则没有理由针对可迭代性进行优化)
  • 短于一百左右的列表会始终记录您的整体记录(例如,用户所属的组列表可能总是与该用户一起获取,并且平均5-10项;可能没有理由将其分开)

提取作者就像将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的视图和高级查询utils:

/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());
});


 类似资料:
  • 非规范化数据不存储规范化的数据。换句话说非规范化意味着相同数据的多个拷贝同时存在。 上一章中,我们在帖子中非规范化评论总数,以避免每次都加载所有的评论。在数据建模意义上说这是冗余的,因为我们可以通过计数每个评论,随时计算出该总数(当不考虑运行速度)。 非规范化通常意味着额外的开发工作。在例子中,我们每次添加或删除评论时,还需要同时更新相关的帖子,以确保 commentsCount 字段保持准确。这

  • 问题内容: 假设我有一个客户表: 此表也 没有 主键。但是,并且对于任何给定都 应该 是唯一的。 该表包含许多重复的客户并不少见。为了避免重复,使用以下查询仅隔离唯一的客户: 幸运的是,该表格传统上包含准确的数据。也就是说,从来没有任何冲突或任何冲突。但是,假设有冲突的数据确实将其放入表中。我希望编写一个将失败的查询,而不是为有问题的查询返回多行。 例如,我尝试此查询没有成功: 有没有办法使用标准

  • 问题内容: 我已经阅读了有关“ 构建数据”的Firebase文档。数据存储很便宜,但用户的时间却不便宜。我们应该针对get操作进行优化,并在多个地方编写。 因此,我可能会存储一个 列表 节点和一个 列表索引 节点,两者之间有一些重复的数据,至少是列表名称。 我正在使用ES6,并在我的javascript应用程序中承诺处理异步流,主要是在第一次数据推送后从firebase中获取ref键。 知道我的应

  • 问题内容: 用例说明 我们有一个关系数据库,其中包含有关我们日常运营的数据。目的是允许用户使用全文本搜索引擎来搜索重要数据。数据经过规范化,因此不是进行全文查询的最佳形式,因此,其想法是对数据的一部分进行规范化,然后将其实时复制到Elasticsearch,这使我们能够创建快速而准确的搜索应用程序。 我们已经有了一个启用数据库操作(插入,更新,删除)事件搜索的系统。这些事件仅包含已更改的列和主键(

  • 问题内容: 我正在使用Ruby on Rails 3.0.7和MySQL5。在我的应用程序中,我有两个数据库表,即TABLE1和TABLE2,并且出于性能原因,我对TABLE2中的某些数据进行了非规范化,因此我在该表中重复了TABLE1的值。现在,在TABLE1中,我需要更新一些涉及的值,当然,我还必须在TABLE2中正确地更新非规范化的值。 我该如何以高效的方式更新这些值? 也就是说,如果TAB

  • 我阅读了cassandra数据建模,除了非规范化数据可能会发生变化之外,一切都很清楚。我如何同步它?当用户电子邮件更改时,更新的方法是什么: < code>groupname是组的一部分,数据模型中的用户可能不知道任何组,因此在用户更改后无法更新电子邮件。 下面描述的解决方案是否合适? 向用户模型中添加一列(类型