代码之家  ›  专栏  ›  技术社区  ›  Apollo giaset

构建我的数据-Firebase

  •  0
  • Apollo giaset  · 技术社区  · 9 年前

    我正在创建一个原型组列表应用程序。我想要以下对象:

    • 使用者
    • 列表
    • 项目
    • 议论

    我认为我应该将其结构如下:

    http://myapp.firebase.io/user/
    http://myapp.firebase.io/user/uid/lists/
    http://myapp.firebase.io/list/
    http://myapp.firebase.io/item/listid/
    http://myapp.firebase.io/comment/itemid
    

    哪里 http://myapp.firebase.io/user/uid/lists/ 指向列出唯一id, http://myapp.firebase.io/item/listid/ 指向给定列表的所有项对象,以及 http://myapp.firebase.io/comment/itemid 指向给定项的所有注释。

    这种结构有意义吗?我这样做而不是进一步嵌套的原因(即。 http://myapp.firebase.io/list/listid/item/ 项目和 http://myapp.firebase.io/list/listid/item/itemid/comment 因为它在文档中说,无论何时获取对象,都会获取所有子对象。有时(甚至大多数时候)我想获取列表中的条目,但不是每个条目的注释。我可能只想在用户点击该项目时这样做。

    1 回复  |  直到 9 年前
        1
  •  2
  •   Frank van Puffelen    9 年前

    在NoSQL数据库中,您应该为您打算如何使用数据建模。我强烈建议你阅读这篇文章 article on NoSQL data modeling .

    顶层结构看起来很好,没有违反 Firebase's recommendation to limit nesting of data 。但是还有很多其他地方你可能会犯错误(这也是这个问题对于堆栈溢出来说有点过于宽泛的原因之一,但我还是会尝试回答其中的一些问题)。

    我会将用户的列表分成一个单独的顶级节点:

    /userlists/$uid/$listid
    

    这样 /users/$uid 节点将只包含用户的配置文件信息,您可以廉价地显示用户列表。您甚至可以考虑将用户配置文件中最可见的部分拆分为另一个顶级节点,以便更便宜地显示这样的列表。

    /usernames/$uid
    

    在这种情况下,您将复制数据。但是存储(相对)便宜,而优化更常见的数据读取是NoSQL数据库能够如此良好扩展的原因之一。

    正如您可能注意到的,我关注于显示用户名列表、检索用户列表以及访问特定用户的配置文件。这些是用例,我们正在对数据进行建模以适应它们。

    在NoSQL数据库中,您应该 为应用程序如何访问数据建模 .我强烈建议您阅读 关于NoSQL数据建模的文章 .

    在那之后,写出你的用例列表,看看如何最容易地访问它的数据。自由地 denormalize 并且偶尔重复数据以适应用例。使用 multi-location updates 以保持非规范化和重复数据与其主实体同步。