什么是构buildFirebase数据的最佳方式?

我是firebase的新手,我想知道什么是构build数据的最好方法。

我有一个简单的例子:

我的项目上有应用程序和应用程序。 1个申请人可以有几个申请。 如何将这两个对象关联到firebase上? 它是否像关系数据库一样工作? 或者在数据devise方面需要完全不同的方法?

更新 :现在有一个关于结构化数据的文档 。 另外,在NoSQL数据结构中看到这个优秀的post。

与RDBMS相比,分层数据的主要问题是,我们可以嵌套数据。 一般来说,尽pipe缺less连接语句和查询,但是您希望在某种程度上对数据进行规范化(就像使用SQL一样)。

您还希望在读取效率值得关注的地方进行非规范化处理 。 这是所有大型应用程序(例如Twitter和Facebook)所使用的技术,尽pipe它违背了我们的DRY原则,但它通常是可扩展应用程序的一个必要特性。

这里的要点是,你要努力写作,使读取容易。 保持单独读取的逻辑组件(例如,对于聊天室,如果您希望能够稍后迭代组,则不要将消息,有关房间的元信息和成员列表全部放在同一位置)。

Firebase的实时数据与SQL环境之间的主要区别在于查询数据。 由于数据的实时性(它不断变化,分片,协调等等,这就要求更简单的内部模型来保持同步的客户端),没有简单的方法来说“SELECT USERS WHERE X = Y”

一个简单的例子可能会让你处于正确的状态,所以在这里:

/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)); 

这种方法的问题是,我刚刚强迫客户端下载所有用户的messageswidgets 。 如果这些东西中没有一个数字是成千上万的 但是对于每个5k个消息的10k用户来说是一件大事。

所以现在最佳的分层结构战略变得更加明显:

 /user_meta/uid/email /messages/uid/... /widgets/uid/... 

在这个环境中非常有用的另一个工具是索引。 通过创build具有特定属性的用户索引,我可以通过迭代索引来快速模拟SQL查询:

 /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文章中提供了一些细节, 所以请检查一下 。 我看到弗兰克已经发表了阿南特的文章,所以我不会在这里重申,但这也是一个很好的阅读。

Firebase非常不像关系型数据库。 如果你想比较任何东西,我会比较它到一个分层的数据库。

Anant最近在Firebase博客上写了一篇关于反规范化数据的文章: https : //www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html

我确实build议保留每个申请人的“身份证”作为每个申请人的孩子。

你的情况看起来像关系世界中的一对多,根据你的例子申请人有很多的应用程序。 如果我们来到firebase nosql的方式,它看起来像下面。 它应该扩大与任何性能问题。 这就是为什么我们需要如下所述的非规范化。

 applicants:{ applicant1:{ . . applications:{ application1:true, application3:true } }, applicant2:{ . . applications:{ application2:true, application4:true } }} applications:{ application1:{ . . }, application2:{ . . }, application3:{ . . }, application4:{ . . }}