Firebase数据结构 - Firefeed结构是否相关?

时间:2014-12-18 10:24:32

标签: firebase

Firefeed是Firebase可以实现的一个非常好的例子 - 一个完全客户端的Twitter克隆。所以有这个页面:https://firefeed.io/about.html,其中解释了采用的数据结构背后的逻辑。了解Firebase安全规则有很大帮助。

在演示结束时,有一段代码:

  var userid = info.id; // info is from the login() call earlier.
  var sparkRef = firebase.child("sparks").push();
  var sparkRefId = sparkRef.name();

  // Add spark to global list.
  sparkRef.set(spark);

  // Add spark ID to user's list of posted sparks.
  var currentUser = firebase.child("users").child(userid);
  currentUser.child("sparks").child(sparkRefId).set(true);

  // Add spark ID to the feed of everyone following this user.
  currentUser.child("followers").once("value", function(list) {
    list.forEach(function(follower) {
      var childRef = firebase.child("users").child(follower.name());
      childRef.child("feed").child(sparkRefId).set(true);
    });
  });

它显示了如何完成写作以保持阅读简单 - 如上所述:

  

当我们需要显示特定用户的Feed时,我们只需要查看一个地方

所以我明白了。但是,如果我们看一下Twitter,我们可以看到一些帐户有数百万粉丝(其中大多数是凯蒂佩里超过6100万!)。这种结构和这种方法会发生什么?每当Katy发布一条新推文时,它都会产生6100万次写操作。这不会简单地杀死应用程序吗?更重要的是,它是否消耗了大量不必要的空间?

1 个答案:

答案 0 :(得分:6)

对于非规范化数据,连接数据的唯一方法是写入其读取的每个位置。所以是的,向6100万粉丝发布推文需要6100万次写作。

您不会在浏览器中执行此操作。服务器会为新推文收听child_added个事件,然后一组工作人员会分拆负载,一次分页一组关注者。您可以优先考虑在线用户以获得写入优先权。

使用标准化数据,您只需编写一次推文,但需要支付读取时的连接费用。如果您在推文中缓存推文以避免针对每个请求访问数据库,那么对于每个Katy Perry推文,您都会回复6100万次写入redis。要实时推送推文,无论如何,您需要将推文写入套接字以供每个在线关注者使用。