我想知道在进行n + 1次查询时Firebase的性能。让我们考虑一下本文https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html中的示例,其中链接有很多注释。如果我想获得链接的所有评论,我必须:
以下是该文章中的示例代码,该代码提取属于链接的所有评论:
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个查询。我应该担心这个表现吗?
答案 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