在 Firebase 中构建关系

2023-12-29

我的 Firebase 中有两项:providers and services,我正在尝试找出使用 Firebase 推荐的扁平化架构方法构建和建立关系的最佳方法。

我的数据看起来像这样:

{
  "services" : {
    "hip_replacement" : {
      "title" : "Hip Replacement"
    }
  },

  "providers" : {
    "the_blue_hospital" : {
      "title" : "The Blue Hospital"
    }
  }
}

我想将这两个项目链接在一起,这样,如果您要访问“髋关节置换”页面,“蓝色医院”将显示在其下方,如果您要访问“蓝色医院”页面,“髋关节置换”将显示在其下方。本质上是双向关系。

构建这样的东西的最佳方法是什么?我的想法如下:

{
  "services": {
    "hip_replacement": {
      "title": "Hip Replacement",
      "providers": {
        "the_blue_hospital": true,
        "the_red_hospital": true
      }
    },
    ...
  },
  "providers": {
    "the_blue_hospital": {
      "title": "The Blue Hospital",
    },
    "the_red_hospital": {...
    },
    "the_green_hospital": {...
    }
  }
}

有没有更好的方法来实现这个或更优雅的解决方案?任何帮助表示赞赏。

提前致谢!


Firebase 中联接数据的问题在于,您针对某些读取或更新用例进行了优化,而牺牲了其他用例。在上面的示例中,创建或删除服务和提供商之间的关系需要对每个“表”进行两次单独的更新。这确实没有什么问题,但这不是唯一的方法。

对于中等大小的数据集,您可以有一个将服务映射到提供者的“连接表”,类似于关系数据库世界中可能执行的操作。数据可能看起来像这样:

{
  "services": {
    "hip_replacement": {}
  },
  "providers": {
    "the_blue_hospital": {...},
    "the_red_hospital": {...},
    "the_green_hospital": {...}
  },
  "serviceProviders": {
    "-JqD5JX0RUDTXsu7Ok3R": {
      "provider": "the_blue_hospital",
      "service": "hip_replacement"
  }
    "-JqDoKfyJqPkQlCXDvFM": {
      "provider": "the_green_hospital",
      "service": "hip_replacement"
  }
    "-JbE7Ji_JRz2bHgBdMWQ": {
      "provider": "the_blue_hospital",
      "service": "hip_replacement"
  }
}

这种方法有优点和缺点:

Pro

  • 轻松在一处添加映射
  • 轻松在一处删除映射
  • 灵活的选项可以重新格式化数据以进行显示,超越单个提供商或服务的上下文(例如索引)。

Con

  • 您已加载整个数据集。 Firebase 不允许您在键内进行过滤,客户端必须加载整个列表,然后在内存中进行过滤。我怀疑这对于数百条记录来说效果很好,无论如何,也许对于几千条记录也可以。
  • 您必须执行一些客户端工作来过滤要显示的列表并将其与实际的服务和提供商数据合并。同样,如果数据集不太大,underscore/lodash groupBy() 可以轻松完成此任务。

您应该考虑:

  • 你会做多少更新和删除?
  • 加入信息真的那么简单吗?您是否需要更多记录(显示名称、价格等),从而使连接表的维护比我建议的更加复杂?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Firebase 中构建关系 的相关文章

随机推荐

  • 权限设置为777,文件仍然不可写

    我已将文件权限设置为 777 但无法使用 PHP 写入该文件 我可以在我的 FTP 客户端中清楚地看到该文件具有 0777 权限 当我这样做时 echo true is writable file txt yes no 我得到 不 我也尝试
  • try/catch 块内的 Response.Redirect 异常

    比如说 我有一个 try catch 块 它封装了一大块代码 然后在其中的某个位置我需要这样调用 Response Redirect protected void ButtonGo Click object sender EventArgs
  • java泛型:获取具有泛型参数的类的类

    我很好奇如何进行这项工作 Class
  • R,dplyr:根据条件快速构建互补行列表的函数

    我有一个约 80 000 行 x 26 列的数据集 这些行对应于机器人搭建套件的 SKU 或唯一 ID 这些列对应 26 个不同的机器人部件 一个单元包含了对构建整个机器人的贡献的一部分 行比例的总和可能不会等于 1 0 因为拼搭套装并不总
  • Java (Android) 中的 List 是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 Type 叫什么 https stackoverflow com questions 1286005 what is typetype called List gt 在 java 泛型中意味着什么 h
  • 如何在 MATLAB 中将变量值放入文本字​​符串中?

    我正在尝试编写一个需要两个输入的简单函数 x and y 并将它们传递给其他三个简单的函数 对它们进行加 乘 除操作 然后 主函数应将结果显示为包含以下内容的字符串 x y 以及总数 我认为我对输出参数有些不理解 无论如何 这是我的 可怜的
  • 类存在多个定义

    我正在使用 Kohana 框架 它允许多个类定义 在应用程序和系统子文件夹中 我使用 phpstorm 作为 IDE 它会向我发送消息multiple definitions exist for class 有没有办法告诉 phpStorm
  • 在android中的共享首选项中禁用对话框通知

    我在有铃声的应用程序中有共享偏好 我想禁用通知短信和彩信以及来自应用程序的通知 例如警报通知
  • sql中*是什么意思?

    例如 我知道什么SELECT FROM example table 方法 然而 不知道代码的每一部分的含义 我感到不舒服 SQL 查询的第二部分是您要为所获取的每条记录检索的列的名称 显然 您可以为每个记录检索多个列 并且 仅当您想检索al
  • AngularJS 对许多输入进行数据绑定的方式是什么?

    我正在学习 angularjs 我希望能够让用户输入许多输入 当这些输入被输入list数组元素应该相应改变 我想尝试使用 ngRepeat 指令 但我读到 因为它创建了一个新范围 所以我无法进行数据绑定 div div
  • 如何获取backgroundSession NSURLSessionUploadTask响应

    我已经实现了一个在后台运行的 NSURLSession 因此即使应用程序暂停 它也可以使用系统守护进程继续执行任务 问题是 void URLSession NSURLSession session dataTask NSURLSession
  • 如何以编程方式启用 LAN 唤醒

    有没有办法以编程方式进入 BIOS 并为支持 LAN 唤醒功能的计算机打开该功能 理想情况下 解决方案应该是跨 BIOS 的 但使用单独的解决方案来打击每个主要供应商也是可以的 BIOS 配置是操作系统有意限制的内容 以避免病毒问题 以前有
  • 通过外部“C”链接解决重载问题

    在混合 C C 项目中 我们需要从 C 调用 C 函数 要调用的函数被重载为三个单独的函数 但我们可以从 C 端忽略这一点 我们只需选择最合适的一个并坚持使用该函数 有两种方法可以做到这一点 1 编写一个带有 extern C 函数的小型
  • 升级到 2.4.0 后,Spring Cloud 配置客户端无法从配置服务器获取/加载配置文件

    弹簧云配置客户端无法从中读取配置文件弹簧云配置服务器升级到后2 4 0使用 spring cloud 版本2020 0 0 M6 从 spring boot 2 4 0 版本开始 默认不启用 bootstrapping 需要在你的应用程序中
  • 在 Mac 10.9.2 上安装 WordNet

    我正在尝试在 Mac 操作系统 10 9 2 上安装 WordNet 我尝试过以下方法 配置 make 但期间make我遇到了一些错误 然后我安装了XQuartz 2 7 5 我仍然遇到一些错误make 接下来 我安装了 Xcode 但这仍
  • VHDL-读取HEX文件

    In VHDL 从 HEX 文件初始化 std logic vector 数组 https stackoverflow com questions 20164216 vhdl init std logic vector array from
  • 为什么我们不应该在java中使用受保护的静态

    我正在经历这个问题Java中有没有办法覆盖类变量 https stackoverflow com questions 685300 is there a way to override class variables in java 首先c
  • ListView 项目上的删除按钮

    我开始为 UWP 进行开发 我正在尝试创建一个ListView填充有x bind 现在我想在所有单个项目上创建一个按钮来删除它们 类似于 Windows 10 邮件 我已经创建了
  • 使用字符串值作为变量名[重复]

    这个问题在这里已经有答案了 是否可以使用 String 作为变量名 就像这个例子一样 String musicPlaying music2 Music music1 new Music blaalla Music music2 new Mu
  • 在 Firebase 中构建关系

    我的 Firebase 中有两项 providers and services 我正在尝试找出使用 Firebase 推荐的扁平化架构方法构建和建立关系的最佳方法 我的数据看起来像这样 services hip replacement ti