我是新手,想知道在 Firebase 上构建数据的最佳方法。
我有一个简单的例子:
我的项目中有申请人和申请。1个申请人可以有多个申请。我该如何在 Firebase 上关联这2个对象?它是否像关系型数据库一样工作?或者在数据设计方面需要完全不同的方法?
我是新手,想知道在 Firebase 上构建数据的最佳方法。
我有一个简单的例子:
我的项目中有申请人和申请。1个申请人可以有多个申请。我该如何在 Firebase 上关联这2个对象?它是否像关系型数据库一样工作?或者在数据设计方面需要完全不同的方法?
/users/uid
/users/uid/email
/users/uid/messages
/users/uid/widgets
现在,由于我们处于分层结构中,如果我想要迭代用户的电子邮件地址,我可以这样做:
// I could also use on('child_added') here to great success
// but this is simpler for an example
firebaseRef.child('users').once('value')
.then(userPathSnapshot => {
userPathSnapshot.forEach(
userSnap => console.log('email', userSnap.val().email)
);
})
.catch(e => console.error(e));
/user_meta/uid/email
/messages/uid/...
/widgets/uid/...
/users_with_gmail_accounts/uid/email
现在,如果我想获取Gmail用户的邮件,我可以这样做:
var ref = firebase.database().ref('users_with_gmail_accounts');
ref.once('value').then(idx_snap => {
idx_snap.forEach(idx_entry => {
let msg = idx_entry.name() + ' has a new message!';
firebase.database().ref('messages').child(idx_entry.name())
.on(
'child_added',
ss => console.log(msg, ss.key)
);
});
})
.catch(e => console.error(e));
我在另一个SO帖子中提供了一些有关数据非规范化的详细信息,因此也请查看那个帖子。我看到Frank已经发布了Anant的文章,因此我就不在这里重复了,但是那也是一篇很棒的文章。
Firebase与关系型数据库有很大不同,如果想进行比较,我会将其与分层数据库进行比较。
Anant在Firebase博客上最近写了一篇关于数据去规范化的好文章:https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html
我确实建议将每个应用程序的“ID”作为每个申请者的子级保留。
根据您的例子,您的场景在关系数据库中看起来像是一对多关系,一个申请人拥有多个申请。如果我们按照Firebase的nosql方式,它看起来如下。它应该可以扩展而不会出现任何性能问题。这就是为什么我们需要像下面提到的那样去规范化。
applicants:{
applicant1:{
.
.
applications:{
application1:true,
application3:true
}
},
applicant2:{
.
.
applications:{
application2:true,
application4:true
}
}}
applications:{
application1:{
.
.
},
application2:{
.
.
},
application3:{
.
.
},
application4:{
.
.
}}