坚持为我的firebase数据库设计架构

 想丶风吹叶落 发布于 2023-01-07 19:07

我来自SQL背景,所以我在设计我的nosql firebase架构时遇到了问题.我习惯于能够使用"WHERE"子句查询任何内容,而且在firebase中这样做似乎更难(尽管性能很容易弥补它!).

我正在为歌曲存储"轨道"对象.这些对象具有键/值对,如artist_name,曲目标题,流派,等级,created_date等,如下所示:

tracks
|_____-JPl1zwOzjqoM8xDTFll
          |____ artist: "Bob"
          |____ title: "so long"
          |____ genre: "pop"
          |____ rating: 52
          |____ created: 1403129692781
|
|_____ -JPv7KnVi8ASQJjRDpvh
          |____ artist: "Mary"
          |____ title: "im alright now"
          |____ genre: "rock"
          |____ rating: 70
          |____ created: 1403129692787

我网站上的默认行为是列出所有这些曲目,最新添加的曲目显示在列表顶部.我可以将我的$优先级设置为创建并将其设置为负(创建*-1)以实现此效果.

但是在将来,我希望能够通过其他方式过滤/查询列表,例如:

检索所有具有摇滚,流行或嘻哈风格的曲目.

检索所有评分为80或更高且已在过去7天内添加的曲目.

如何在firebase中实现这一目标?我的理解是,实际上只有两种订购数据的方法:

    通过"ID"值,其中包含"firebaseURL.firebaseio.com/tracks/id"的物理位置,在我的情况下,当我添加曲目时,会自动为我选择.这是可以的(我认为),因为我有列出详细信息的单个跟踪页面的页面,我网站上的URL类似于"www.mysite.com/tracks/-JPl1zwOzjqoM8xDTFll".

    通过使用$ priority,在我的情况下,我使用了"创建"值,以便按正确的日期顺序排列我的列表.

鉴于我设置的方式(如果有更好的方法,请告诉我),有没有办法可以轻松查询特定类型或特定评级?

我阅读了博客"将您的数据归结为正常"(https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html),我想我明白了.从Anant所描述的,实现我想要的一种方法可能是在firebase中为一个类型创建一个新对象并列出那里的所有轨道,如下所示:

tracks
|______ All
        |_____ -JPlB34tJfAJT0rFT0qI
        |_____ -JPlB32222222222T0qI
        |_____ -JPlB34wefwefFT0qI

|______ Rock
        |_____ -JPlB32222222222T0qI
        |_____ -JPlB34tJfAJT0rFT0qI

|______ Pop
        |_____ -JPlB34wefwefFT0qI

博客的前提是,硬盘空间很便宜,但用户的时间不是.因此,可以存在重复数据,因为它允许更快的读取.

这是有道理的,我不介意这种方法.但这只有在用户想要从一种类型中选择所有曲目时才有效.如果他们想要从BOTH摇滚和流行音乐中获得所有曲目怎么办?每次有人提交任何类型的歌曲时,我是否必须存储另一个名为Rock&Pop的对象并在其中存储音轨?

genre
|_______pop-rock
         |_________ -JPlB34tJfAJT0rFT0qI (a rock song)
         |_________ -JPlB34wefwefFT0qI (a pop song)
         |_________ -JPlB32222222222T0qI (a rock song)

此外,使用trackid存储整个轨道对象或仅使用引用更有意义吗?例如,在/ genre/pop下:

Should I store just the reference?
genre
|______ pop
        |______ -JPlB34wefwefFT0qI

Or, Should I store the entire track?
genre
|______ pop
        |______ -JPlB34wefwefFT0qI
                    |___ artist: "bob"
                    |___ title: "hello"
                    |___ genre: pop
                    |___ etc..

两种方法之间是否存在性能差异?我想也许后者会更快,因为我不需要查询每个单独的轨道以获取其他细节,但我只是想确定.

我已经多次重做我的firebase架构了.我做了一些改进,但随着我的应用程序变得越来越大,更改它会变得更加昂贵并且消耗更多时间.如果我能在最后一段时间内清除这些问题并且花费大量时间重新编写其余代码以再次匹配它,那就太好了.

感谢您对此的任何帮助,非常感谢.如果您需要其他信息,请告诉我.

1 个回答
  • Firebase将在明年推出对查询API的大量补充.上下文搜索(foo就像bar)可能永远不会成为实时数据中的一大亮点 - 它既缓慢又麻烦.

    关于SQL查询和Firebase中的等效模式,有一篇由两部分组成的博客文章.我建议你给它一个通读.第2部分特别讨论了Flashlight.

    为什么选择ElasticSearch和服务?与实时数据存储和同步一样,搜索是一个复杂的主题,具有很多样板和可发现的复杂性.在SQL中编写where子句很容易,这会为你提供一些方法,但很快就会达不到用户的期望.

    ES可以快速集成到Firebase(Flashlight服务与应用程序集成只需不到5分钟,上次我尝试过),并提供强大而全面的搜索功能.

    因此,在Firebase围绕查询推出一些改变游戏规则的功能之前,我建议在开始时检查这种方法,而不是试图通过其他方式来锁定搜索功能.

    2023-01-07 19:09 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有