在 firebase 上构建数据的最佳方式是什么?

2023-12-15

我是 firebase 的新手,我想知道构建数据的最佳方式是什么。

我有一个简单的例子:

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


UPDATE: 现在有一个关于结构化数据的文档。另外,请参阅这篇优秀的文章NoSQL 数据结构.

与 RDBMS 不同,分层数据的主要问题是它很容易嵌套数据,因为我们可以这样做。通常,尽管缺少连接语句和查询,您还是希望在某种程度上规范化数据(就像使用 SQL 所做的那样)。

你也想非规范化在需要考虑读取效率的地方。这是所有大型应用程序(例如 Twitter 和 Facebook)都使用的技术,尽管它违反了我们的 DRY 原则,但它通常是可扩展应用程序的必要功能。

这里的要点是,您希望在写入方面下功夫,以使读取变得容易。将单独读取的逻辑组件分开(例如,对于聊天室,如果您希望稍后能够迭代组,请勿将消息、有关房间的元信息以及成员列表全部放在同一个位置)。

Firebase 的实时数据和 SQL 环境之间的主要区别在于查询数据。由于数据的实时性(它不断变化、分片、协调等,这需要一个更简单的内部模型来检查同步客户端),因此没有简单的方法可以说“在 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));

这种方法的问题是我刚刚强制客户端下载所有用户的messages and widgets也。如果这些东西都没有数以千计,那也没什么大不了的。但对于 10,000 个用户(每个用户有超过 5,000 条消息)来说,这是一个大问题。

因此,现在分层实时结构的最佳策略变得更加明显:

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

在这种环境下非常有用的另一个工具是索引。通过创建具有某些属性的用户索引,我可以通过简单地迭代索引来快速模拟 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 帖子中提供了一些详细信息,所以也检查一下。我看到 Frank 已经发表了 Anant 的文章,所以我不会在这里重申,但这也是一篇很棒的文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 firebase 上构建数据的最佳方式是什么? 的相关文章

  • 使用 firebase 过滤分页列表

    我正在尝试使用 firebase 和 swift 制作一个分页过滤列表 但请随意用您最喜欢的编程语言回答 而不过滤客户端上检索到的数据 假设我有这个结构 matches match 1 name Match 1 users user 1 o
  • 将结构体数组传递给函数 C++

    抱歉这个菜鸟问题我只是有点困惑 如果我在 main 中有一个结构数组 我想将其传递给函数 struct MyStruct int a int b char c mayarray 5 MyStruct StructArray 10 myFun
  • Firebase 查询双重嵌套

    鉴于 firebase 中的以下数据结构 我想运行查询来检索博客 efg 我目前不知道用户 ID Users 1234567 name Bob blogs abc zyx 7654321 name Frank blogs efg hij F
  • 如何为 Firebase 云功能设置 vpc 连接器?

    Firebase Cloud Functions 在 GCP 之上运行 因此 它们是否支持使用专有网络连接器 https cloud google com functions docs connecting vpc 我想要实现的目标是限制转
  • Android 架构组件与 Firebase 特别是 Firestore

    我正在经历这个blog https firebase googleblog com 2017 12 using android architecture components html by 道格 史蒂文森 https twitter co
  • Firebase 未定义?

    我正在开发一个 Angular 项目并使用 Firebase 但出现错误ReferenceError Firebase is not defined 但我不明白为什么 这是我的index html
  • 用于更改密码的 Firebase 云函数侦听器

    在 Firebase 文档中找不到它 但是是否有像创建帐户时那样的密码更改监听器 functions auth user onCreate 目标 向用户发送一封电子邮件 告知其密码已在 Web 应用程序中更改 No 没有 Firebase
  • Angularfire 和 FirebaseListObservable 没有使用 ionic 2 应用程序导出成员 angularfire2

    当我创建 Ionic 2 应用程序时 FirebaseListObservable 和 Angularfire 没有导出成员 angularfire2 将两个文件导入 home ts 我的 Cordova 和 ionic 版本是 科尔多瓦版
  • 在 Mongoose 中保存模型无法保存嵌套组件

    我有以下模型架构 var memberSchema mongoose Schema project type Schema Types ObjectId ref Project first String last String email
  • 应用程序启动时突然出现 Firebase java.lang.IllegalAccessError

    突然发生崩溃安装后应用程序的初始启动 但只是第一次 第二次打开应用程序后它可以正常工作 我没有更改 firebase 代码 但可能是依赖项 但是到最新版本 所以通常它应该是一个稳定的版本 似乎有一些与 firebase 相关的问题 java
  • MongoDB 嵌套数组查询

    我问这个作为评论another https stackoverflow com questions 5250652 query a nested array in mongodb问题 还发了一个question https groups g
  • 如何向 firebase.auth() 添加附加信息

    如何向该数据集添加额外的电话号码和地址属性 Firebase 文档似乎没有指定任何相关内容 我已经使用实现了登录 注册和更新firebase auth Login Email Login firebase auth signInWithEm
  • Firebase 云消息传递 (FCM) 令牌是否独一无二?

    我在 firebase 文档中找不到任何地方表明收到的令牌是唯一的 如果有人能指出我这样的地方 我将不胜感激 主要问题 我应该在数据库中为此类标记设置唯一约束吗 谢谢 根据文档 它们是唯一的 但您无法将它们绑定到特定设备 因为它们可能会发生
  • 当应用程序未运行时如何堆叠 Firebase Cloud Messaging 通知?

    我在用Firebase Cloud Messaging将推送通知从我的服务器发送到我的 Android 应用程序 当应用程序运行时 通知是stacked因为我将它们设置为我的一个组FirebaseMessagingService 这很好 但
  • 手动启用时 Firebase Crashlytics 不报告崩溃

    Crashlytics 在没有选择加入报告的情况下也能正常工作 但一旦我根据规定设置了选择加入报告 它就会停止报告任何内容tutorial https firebase google com docs crashlytics customi
  • Firebase Messaging FCM 在可配置的时间间隔内分发

    当您使用 FCM 向给定应用程序的所有设备发送推送时 这可能会导致许多用户同时打开他们的应用程序 从而导致大量服务器轮询 从而导致负载峰值 有没有一种方便的方法可以在给定的时间间隔内分发消息以进行计划推送 最后 我们找到了一种可能的方法 通
  • 从 Firestore 获取文档时,我是否也获取该文档内的集合?

    如果是的话 如何获得它 因为在进行文档引用时 您只能访问该文档的字段 而不能访问集合 从 Firestore 获取文档时 我是否也得到了 该文档内的集合 不 当获取文档时 您只会获取该文档的字段 正如本节中所解释的document http
  • 将所有奇数位置的元素移动到左半部分,将偶数位置的元素移动到右半部分

    给定一个包含正整数和负整数的数组 将所有奇数索引元素移动到左侧 将偶数索引元素移动到右侧 问题的难点是在维持秩序的同时就地做 e g 7 5 6 3 8 4 2 1 输出应该是 5 3 4 1 7 6 8 2 如果顺序不重要 我们可以使用快
  • 当 Firebase 函数以 Swift 结束时

    我在我的应用程序中使用 Firebase 它查询大量用户并获取所需的特定数据 但是当它开始查询时 其余功能也继续运行 而不仅仅是查询 所以我无法理解当它结束时 例如在这段代码中 ref observeEventType ChildAdded
  • 应用程序关闭时单击 Firebase 通知后打开特定活动/片段

    我知道这个问题似乎重复 但根据我的要求 我在网上搜索了很多帖子 但没有任何对我有用 我的要求 我正在使用 Firebase 来获取推送通知 当应用程序打开时意味着一切正常 但我的问题是 如果有任何推送通知出现 应用程序处于后台 关闭意味着我

随机推荐

  • VSTS 无法构建我非常非常简单的 ASP.NET Core 应用程序

    下面的内容是如此简单 但它失败了 怎么了 我在 Visual Studio 2017 中创建一个新的 ASP NET Core Web 应用程序 NET Framework 4 6 2 我没有对默认模板进行任何更改 而是将其推送到 VSTS
  • 为什么使用armeabi-v7a 代码而不是armeabi 代码?

    在我当前的项目中 我使用多个 so 文件 它们位于armeabi 和armeabi v7a 文件夹中 不幸的是 其中一个 so 文件大小为 6MB 我需要减小文件大小 我只想使用armeabi 文件并删除armeabi v7a 文件夹 而不
  • 如何在 Java 代码和 .proto 文件之间共享 Enum 值

    我有一个类 我希望对其进行 protobuf 在该类中 其中一个字段是枚举 在它自己的类中 我可以避免在 proto 文件中定义相同的枚举值吗 或者我是否必须手动确保 java 代码中的枚举定义与 proto 文件中的相同 java代码 p
  • Objective c 中的多维数组

    大家 我想在目标c中创建一个8 8维数组 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  • 删除 MySQL 中部分相似的行

    我需要使用 MySQL 删除表中部分相似的行 前任 从table1 id color1 color2 key 内容 id color1 color2 key 1 Blue Green AASDDD 2 Blue Green JJUUYYY
  • Xcode 错误地声称 CFBundleExecutable 为 (null)

    我正在尝试创建一个 iPhone 应用程序的临时版本以进行 Beta 测试 最后 他们看到了如下错误 xxx 处的应用程序的 info plist 指定了 null 的 CFBundleExecutable 该 CFBundleExecut
  • mysql中group by之前对数据进行排序(order by)

    我想对以下数据进行分组sub prd id 但在此之前我需要来自的订单数据max created at 我写了如下查询 select FROM prd data group by sub prd id order by created at
  • 创建 OS X 服务

    我正在尝试创建 OS X 服务 我发现提供系统服务在苹果的文档中 但是我发现它不太清楚我到底需要做什么 我目前正在使用一个应用程序来注册我的服务 认为这会更直接 最终我想创建一个 service 但是即使在注销 登录后 我的服务仍然没有出现
  • 将文件夹中的所有 jar 添加到 jmeter 类路径

    我有一个 CI 服务器 将多个应用程序 jar 及其各种依赖项转储到一个文件夹中 然后我尝试使用 jmeter 类路径中的所有 jar 运行 jmeter 测试 我可以设置jmeter的user classpath属性到以 分 冒号分隔的各
  • 在 Ruby 中,foo.inspect 可以打印出所有实例变量——如果没有访问器,我们可以打印出单独的变量吗?

    很多时候 我们可以使用p foo or foo inspect查看实例变量 但这只是默认行为 并且对象可以选择显示其他内容 或隐藏所有实例变量 可能通过重新定义inspect方法 主要问题是 我是否能看到foo inspect这就是了 ba
  • FlipView:如何将 Collection 绑定为 ItemsSource

    有没有一种聪明的方法来绑定Collection
  • 从客户端接收“utf-8”时出现问题

    我正在尝试使用以下命令在服务器和客户端之间创建双向通信Flask and socket io 一切正常 直到服务器收到utf 8来自客户端的字符串 出现乱码 从服务器发送到客户端工作正常 并且在从客户端发送到服务器之前 客户端正确打印消息
  • 使用 SED 删除重复字符而不进行反向引用

    假设我们有一个文件包含 HHEELLOO HHYYPPOOTTHHEESSIISS 我们要删除重复的字符 据我所知 我们可以这样做 s A Z 1 1 g 这是一个家庭作业 教授说他希望我们在没有反向引用或扩展正则表达式的情况下尝试这些练习
  • 在 QTextEdit 中的字符串后插入 QImage

    我正在尝试将文本打印到 QTextEdit 字段中 但由于某种原因 图像首先显示 这是我的代码 import sys from PyQt4 import QtCore QtGui from PyQt4 QtCore import from
  • 如何查找任何 Android 应用程序的用户花费时间

    您好 我正在开发一个应用程序 我需要查找用户在 Facebook 等特定应用程序上花费的时间 每当用户花费 x 分钟时 我想给用户一些奖励 Android 有什么好的方法可以实现这一点吗 正如问题中所指出的检测其他应用程序何时打开或启动 您
  • Rails 3 后台作业管理器

    有谁知道与 Rails 3 一起使用的后台作业管理器吗 我听说过 Starling 和 Workling 但我没有看到 Rails 3 的分支 I used 本文让delayed job 一个common Rails 2 gem 用于对稍后
  • 方差分析 (rstatix) 中“mutate()”输入“数据”的问题

    这真让我抓狂 我在用anova test from rstatix它告诉我 我的专栏不在那里 而它们显然在那里 这就是我的数据框的样子 ID c 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 Form c A A
  • “导入keras”和“导入tensorflow.keras”有什么区别

    我想知道 使用从tensorflow导入keras有什么区别import tensorflow keras或者只是 pip 单独安装 keras 并使用导入它import keras因为到目前为止两者似乎都工作得很好 我注意到的唯一区别是我
  • 访问 H2 数据库架构

    我目前正在使用 java 访问嵌入式 H2 数据库jOOQ生成表类等 我当前可以执行诸如 create select from TEST fetch 在我的代码中 返回结果等 但是我无法查询信息模式 我可以使用 H2 控制台访问它 并且为给
  • 在 firebase 上构建数据的最佳方式是什么?

    我是 firebase 的新手 我想知道构建数据的最佳方式是什么 我有一个简单的例子 我的项目有申请人和应用程序 1个申请人可以有多个申请 我如何在 firebase 上关联这两个对象 它像关系数据库一样工作吗 或者在数据设计方面需要完全不