在Firebase中存储大对象并仅访问其中的一部分

时间:2017-02-11 12:33:42

标签: firebase firebase-realtime-database

我想知道在以下情况下,在Firebase中存储数据的最有时负载效率的方法是什么:

有几个文本文档,每个文档都包含许多段落,如下所示:

doc1 {
  title: 'first doc',
  author: 'John Doe',
  creation_date: 1234567890,
  paragraphs: {
    p001{
      text:'This is the first paragraph',
      …}
    p002{
      text:'This is the second paragraph',
      …}
  }
}

如果我想显示其中一个文档,我只需获取数据快照并从网络中获取整个对象doc1

一旦我想只显示title而是显示所有文档,这种方法似乎有点奇怪。有没有办法排除一些孩子被装上?或者是否有必要重组数据库并收集overview对象,该对象仅包含所有文档的键和标题?

1 个答案:

答案 0 :(得分:2)

从Firebase数据库检索数据时,它始终返回完整的节点。因此,虽然您只能获得文档的标题(使用/documents/doc1/title),但您无法获得文档列表的标题。

Firebase文档建议您不要在公共根目录下嵌套不同类型的数据。其中一个原因正是您现在要问的问题:您经常需要检索书籍的元数据而不检索其余内容。

因此,建模数据的另一种(也就是更常见的)方法是:

documents: {
    doc1: {
      title: 'first doc',
      author: 'John Doe',
      creation_date: 1234567890,
    },
    doc2: {
      title: 'second doc',
      author: 'nehalem',
      creation_date: 1234567891,
    }
},
paragraphs: {
    doc1: {
      p001{
        text:'This is the first paragraph',
        …}
      p002{
        text:'This is the second paragraph',
        …}
    },
    doc2: {
      p001{
        text:'This is the first paragraph',
        …}
      p002{
        text:'This is the second paragraph',
        …}
    }
}

现在,您可以通过阅读/查询/documents获取显示列表的标题,作者和创建日期,然后通过阅读/paragraphs/doc1获取特定图书的段落。