我想对firebase中的数据检索做一些解释。我不是NoSql数据结构的专家,我脑子里想不到什么。这对我来说并不自然。但是,我认为我已经理解了这种结构中双向关系的基础知识。
这是我的数据结构:
{
// Two-way relationships between accounts & logements
"accounts" : {
"uniqueId1" : {
"nom" : 'My name 1',
"email" : 'My email 1',
"logements" : {
uniqueIdLogement1 : true,
// do I have to list relationships with images & geofire here ?
uniqueIdLogement2 : true
},
"favorites" : {
uniqueIdLogement2 : true,
uniqueIdLogement25 : true,
uniqueIdLogement32 : true
}
},
....
},
// Each logement has his own "images" & "geofire" data
"logements" : {
"uniqueIdLogement1" : {
"nom_du_logement" : 'My logement name 1',
"accounts" : {
uniqueId1 : true
},
"images" : {
uniqueIdImages1 : true,
uniqueIdImages2 : true,
uniqueIdImages3 : true,
},
"geofire" : {
uniqueIdGeofire1 : true
},
},
...
},
"images" : {
"uniqueIdImages1" : {
"image" : 'My image URL 1',
"logements" : {
uniqueIdLogement1 : true
}
},
...
},
"geofire" : {
"uniqueIdGeofire1" : {
"g" : 'My geofire Data,
"l" : {
0 : '-44.34',
1 : '-3.2'
},
"logements" : {
uniqueIdLogement1 : true
}
},
...
}
}
我认为每个人都有自己对数据结构的看法,但在我看来(参考Firebase文档)它必须非常类似。但如果您看到一些更新,请不要犹豫!
所以,在angularJs中,我想列出每个" logements"对于" uniqueId1"例如,展示他们自己的"图像" &安培;地理位置数据(并检查它们是否是我的用户最喜爱的物品)。
是否可以这样做?
// list every logements for account ID1
// for each logement take images data & geofire data & check if favorites
// push infos in $scope.items & display with ng-repeat
另一个与此相关的问题:当我删除" logements"对于用户ID1,我想删除所有图像& geofire参考......!是否也可以这样做?
// remove uniqueIdLogement1 from account ID 1
// remove images where "logements" = uniqueIdLogement1
// remove goofier where "logements" = uniqueIdLogement1
我认为,如果我理解正确,那对我来说没问题!我现在无法看到它是如何工作的,令人沮丧,因为我知道这种数据库有很大的潜力。你能解释一下我的一些细节吗?非常感谢你
答案 0 :(得分:1)
对于任何数据库,您经常需要从多个位置加入数据来构建视图。
在关系数据库中,您可以使用JOIN
子句通过单个语句从这些多个位置(在该情况下为表)中获取数据。
在Firebase(以及许多其他NoSQL数据库)中,没有内置方法可以从多个位置连接数据。因此,您必须在代码中执行此操作。
var ref = firebase.database().ref();
var accountRef = ref.child('accounts/uniqueId1');
accountRef.on('value', function(accountSnapshot) {
var logementCount = accountSnapshot.child('logements').numChildren;
var logementLoadedCount = 0;
accountSnapshot.child('logements').forEach(function(logementKey) {
var logementRef = ref.child('logements').child(logementKey.key);
logementRef.once('value', function(logementSnapshot) {
var logement = logementSnapshot.val();
logementLoadedCount = logementLoadedCount + 1;
if (logementLoadedCount == logementCount) {
console.log('We've loaded all logements');
}
});
});
});
来自SQL和传统Web开发背景的许多开发人员都担心所有嵌套调用的性能。在Firebase中不需要(对于合理数量的数据),因为Firebase会通过单个连接对请求进行管道传输。请参阅Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly。
总的来说,我强烈建议您阅读NoSQL data modeling上的这篇文章,以便对一般主题做一个很好的介绍。