数据重复几乎是 NoSQL 中的常态,因此存储计数器是完全合理的。查看有关非规范化的 Firebase 文章
这几乎总结了我理解的方法。
使用计数器
假设您使用良好的 DRY 原则并集中您对记录的所有操作,它很快而且相当简单。每次添加或删除记录时,使用事务更新计数器:
function addUser(user) {
// do your add stuff...
updateCounter(1);
}
function removeUser(user) {
// do your remove stuff...
updateCounter(-1);
}
function updateCounter(amt) {
userCounter.transaction(function(currentValue) {
currentValue || (currentValue === 0); // can be null
return currentValue + amt;
});
}
分离公共数据和安全数据
将敏感数据(电子邮件地址,人们看不到的东西)存储在私有路径中,保持其公共用户数据的可读性。
这避免了同步计数器的需要。但是,这确实意味着客户端必须下载整个公共用户列表才能创建计数。因此,请保持公共配置文件较小(名称、时间戳,仅此而已),这样它就可以在不花几秒钟的情况下处理数万个。
"users": {
".read": true,
"$user": {
// don't try to put a ".read" here; it won't remove access
// after the parent path allows it
}
}
"users_secured": {
"$user": {
".read": "auth.id === $user"
}
}
使用服务器进程
轻松无痛;对客户来说超级快速,只要占用空间小,就可以轻松处理数十万个配置文件。需要你维护一些东西。Heroku和Nodejitsu将免费提供此服务,直到您听到用户。
var Firebase = require('firebase');
var fb = new Firebase(process.env.FBURL);
fb.auth( process.env.SECRET, function() {
fb.child('users').on('value', function(snap) {
fb.child('user_counter').set( snap.numChildren() );
});
}