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万次写操作。这不会简单地杀死应用程序吗?更重要的是,它是否消耗了大量不必要的空间?
答案 0 :(得分:6)
对于非规范化数据,连接数据的唯一方法是写入其读取的每个位置。所以是的,向6100万粉丝发布推文需要6100万次写作。
您不会在浏览器中执行此操作。服务器会为新推文收听child_added
个事件,然后一组工作人员会分拆负载,一次分页一组关注者。您可以优先考虑在线用户以获得写入优先权。
使用标准化数据,您只需编写一次推文,但需要支付读取时的连接费用。如果您在推文中缓存推文以避免针对每个请求访问数据库,那么对于每个Katy Perry推文,您都会回复6100万次写入redis。要实时推送推文,无论如何,您需要将推文写入套接字以供每个在线关注者使用。