Firebase有很多表现

时间:2015-07-15 23:25:53

标签: performance firebase firebase-realtime-database nosql

我想知道在进行n + 1次查询时Firebase的性能。让我们考虑一下本文https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html中的示例,其中链接有很多注释。如果我想获得链接的所有评论,我必须:

  1. 进行1次查询以获取链接
  2. 下的评论索引
  3. 对于每个评论ID,请进行查询以获取该评论。
  4. 以下是该文章中的示例代码,该代码提取属于链接的所有评论:

    var commentsRef = new Firebase("https://awesome.firebaseio-demo.com/comments");
    var linkRef = new Firebase("https://awesome.firebaseio-demo.com/links");
    var linkCommentsRef = linkRef.child(LINK_ID).child("comments");
    linkCommentsRef.on("child_added", function(snap) {
      commentsRef.child(snap.key()).once("value", function() {
        // Render the comment on the link page.
      ));
    });
    

    我想知道这是否与性能问题相比,如果我使用的是SQL数据库,我可以对注释SELECT * FROM comments WHERE link_id = LINK_ID子句进行单一查询。

    想象一下,我有1000条评论的链接。在SQL中,这将是一个查询,但在Firebase中,这将是1001个查询。我应该担心这个表现吗?

1 个答案:

答案 0 :(得分:2)

要记住的一件事是Firebase可以通过Web套接字(如果可用)工作,因此虽然可能有1001次往返,但只需要建立一个连接。此外:很多往返行程将同时进行。所以你可能会对这需要多长时间感到惊讶。

  

我应该担心吗?

一般来说,人们高估了他们会得到的使用量。所以(再次:一般)我建议你不要担心它,直到你真的有这么多的评论。但是从第1天开始,确保您今天所做的任何事情都无法在以后进行优化。

优化的一种方法是进一步对数据进行非规范化。如果您已经知道每次呈现文章时都需要所有注释,则还可以考虑将注释复制到文章中。

相当常见的情况:

/users
  twitter:4784
    name: "Frank van Puffelen"
    otherData: ....
/messages
  -J4377684
     text: "Hello world"
     uid: "twitter:4784"
     name: "Frank van Puffelen"
  -J4377964
     text: "Welcome to StackOverflow"
     uid: "twitter:4784"
     name: "Frank van Puffelen"

因此,在上面的数据片段中,我为每条消息存储了用户的uid 的名称。虽然我可以从uid中查找名称,但在消息中使用名称意味着我可以在不查找的情况下显示消息。我也保留了uid,因此我提供了用户个人资料页面(或其他消息)的链接。

我们最近对此提出了一个很好的问题,在那里我写了更多关于我为保持派生数据最新而考虑的方法:How to write denormalized data in Firebase