【问题标题】:Firebase - Structuring Data For Efficient IndexingFirebase - 为高效索引构建数据
【发布时间】:2017-01-07 03:37:00
【问题描述】:

我几乎在所有地方都阅读过有关构建 Firebase Database 以进行高效查询的文章,但我仍然对我拥有的两种选择感到有些困惑。

例如,假设我想获取用户过去 7 天左右的所有“maxBenchPressSessions”。

我被困在这两种结构之间:

在第一个数组中,我使用用户的 id 作为属性来索引真假。第二,我使用userId作为属性NAME,它的值是用户的id。

一个比另一个快,还是它们的索引方式相对相同?我对数据库设计有点陌生,所以我想确保我遵循正确的做法。

进展

我想出了一个解决方案,它既可以扁平化我的数据库,又允许我只使用一次orderBy 添加ListenerForSingleValueEvent,但仅当我想检查用户是否为特定日期保存了会话时.

我可以让每个maxBenchPressSession 对象都有一个userId_dateString 格式的键。但是,如果我想获取过去 7 天的所有用户会话,我不知道如何在一个查询中完成。

有什么想法吗?

【问题讨论】:

  • 没有天生更快或更慢的数据结构。区别取决于您如何从代码中访问数据。如果您显示您想要编写的查询,它会更容易提供帮助。一般来说:为您的应用程序如何访问数据建模。见这篇关于NoSQL data modeling的文章
  • 我会使用单值事件侦听器来进行一次查询。我会从过去 7 天的用户那里获得所有 maxBenchPressSessions

标签: firebase database-design firebase-realtime-database nosql


【解决方案1】:

我建议观看视频。它很好地讲述了数据的结构。

References to the playlist on the firebase 3

Firebase 3.0: Data Modelling

Firebase 3.0: Node Client

【讨论】:

  • 我在视频中看到了他使用“用户名”作为键和用户的用户名作为值的部分,但是当 Firebase 文档使用用户的用户名作为键和布尔值时,这与 Firebase 文档相矛盾作为一个值。
  • 我的问题更多是是否更有效或者这些方法是否相同。顺便说一句,我不想​​流式传输数据。我只是设置一个单值事件侦听器只是为了获取一次数据。
【解决方案2】:

据我了解,有效使用 Firebase 的原理。查询数据应该尽可能小,请求多少无关紧要。

但是你会处理这样的请求。我们必须向数据库“negativeDate”添加另一个字段。

此字段允许您获取最后七个条目。这是一个视频 - https://www.youtube.com/watch?v=nMR_JPfL4qg&feature=youtu.be&t=4m36s

.limitToLast(7) - 7 entries
.orderByChild('negativeDate') - sort by date

请求示例:

const ref = firebase.database().ref('maxBenchPressSession');
ref.orderByChild('negativeDate').limitToLast(7).on('value', function(snap){ })

【讨论】:

  • 这非常接近我的需要,但这只会给我过去 7 天的所有会话,无论用户如何。我需要获取过去 7 天内用户的所有会话。
【解决方案3】:

然后添加用户,它会放置其所有会话。

const ref = firebase.database().ref('maxBenchPressSession/' + userId);
ref.orderByChild('negativeDate').limitToLast(7).on('value', function(snap){ })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多