在 firebase 中,使用单独的端点对多对多关系进行建模是一个好主意吗?

2024-05-08

假设我有一个典型的用户和组数据模型,其中用户可以属于多个组,并且一个组可以拥有多个用户。在我看来,Firebase 文档 https://www.firebase.com/docs/web/guide/structuring-data.html建议我通过复制组内的用户 ID 和用户内的组 ID 来建模数据,如下所示:

{
  "usergroups": {
    "bob": {
      "groups": {
        "one": true,
        "two": true
       }
    },
    "fred": {
      "groups": {
        "one": true
      }
    }
  },
  "groupusers": {
    "one": {
      "users": {
        "bob": true,
        "fred": true
      }
    },
    "two": {
      "users": {
        "bob": true
      }
    }
  }
}

为了维护这种结构,每当我的应用程序更新关系的一侧(例如,将用户添加到组)时,它也需要更新关系的另一侧(例如,将组添加到用户)。

我担心最终某人的计算机会在更新过程中崩溃,或者出现其他问题,并且关系的双方将失去同步。理想情况下,我想将更新放入事务中,以便双方都得到更新或双方都不更新,但据我所知,我无法使用 firebase 中当前的事务支持来做到这一点。

另一种方法是使用即将推出的 Firebase 触发器来更新关系的另一端,但触发器尚不可用,这似乎是一个相当重量级的解决方案,可以将消息发布到外部服务器,只是让该服务器保留冗余数据迄今为止。

因此,我正在考虑另一种方法,其中将多对多用户组成员资格存储为单独的端点:

{
  "memberships": {
    "id1": {
      "user": "bob",
      "group": "one"
    },
    "id2": {
      "user": "bob",
      "group": "two"
    },
    "id3": {
      "user": "fred",
      "group": "one"
    }
  }
}      

我可以在“user”和“group”上添加索引,并发出 firebase 查询“.orderByChild(“user”).equalTo(...)”和“.orderByChild(“group”).equalTo(...)”分别确定特定用户的组和特定组的用户。

这种方法有什么缺点?我们不再需要维护冗余数据,那么为什么这不是推荐的方法呢?它是否比推荐的复制数据方法慢得多?


在您建议的设计中,您始终需要访问三个位置来显示用户及其组:

  1. the userschild 确定用户的属性
  2. the memberships确定她属于哪些群体
  3. the groups孩子确定组的属性

在文档中的非规范化示例中,您的代码只需要访问 #1 和 #3,因为成员资格信息都嵌入到两者中users and groups.

如果进一步非规范化,您最终将存储每个用户的所有相关组信息以及每个组的所有相关用户信息。使用这样的数据结构,您只需要读取一个位置即可显示组或用户的所有信息。

在 NoSQL 数据库中,冗余不一定是坏事,实际上正是因为它可以加快速度。

目前,我将采用辅助流程,定期扫描数据并协调它发现的任何不规则数据。当然,这也意味着常规客户端代码需要足够强大才能处理此类不规则数据(例如,指向用户的组,但该用户的记录不指向该组)。

或者你可以设置一些高级.validate确保双方始终同步的规则。我总是发现实施起来需要更多时间,所以从来没有打扰过。

您可能还想阅读这个答案:Firebase 数据结构和 url https://stackoverflow.com/questions/16638660/firebase-data-structure-and-url/16651115#16651115

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

在 firebase 中,使用单独的端点对多对多关系进行建模是一个好主意吗? 的相关文章

随机推荐

  • Django 表单验证消息未显示

    我试图限制可以以表单上传的文件类型 大小和扩展名 该功能似乎有效 但未显示验证错误消息 我意识到if file size gt 4 1024 1024可能不是最好的方法 但我稍后会处理这个问题 这是 forms py class Produ
  • JavaScript:解决意外字符“#”

    介绍 我的 React 应用程序可以执行npm run build在开发模式下 webpack config dev js 但不在生产模式下 webpack config prod js 抛出以下错误 Module parse failed
  • java IO将一个文件复制到另一个文件

    我有两个 Java io File 对象 file1 和 file2 我想将 file1 的内容复制到 file2 有没有一种标准方法可以做到这一点 而无需我创建一个读取 file1 并写入 file2 的方法 不 没有内置方法可以做到这一
  • Azure PostgreSQL 时间点还原不起作用

    我们在 Azure 中有一个 Postgre 数据库 但遇到了一个问题 表中的所有行都被删除 我们尝试使用 de azure 门户中的 时间点还原 选项 但创建的数据库与当前运行的数据库具有相同的数据 我们还尝试了其他日期和时间 数据库问题
  • C++ 中的矩阵类

    我正在做一些线性代数数学 并且正在寻找一些真正轻量级且易于使用的矩阵类 可以处理不同的维度 基本上是 2x2 2x1 3x1 和 1x2 我认为此类可以使用模板来实现 并在某些情况下使用一些专门化来提高性能 有人知道任何可用的简单实现吗 我
  • 隐藏一个表单,切换到第二个表单,关闭第二个表单并取消隐藏第一个表单

    我已经查看了所有建议的答案 但似乎没有什么适合我正在寻找的内容 我想从主窗体中调用第二个窗体 在第二个窗体处于活动状态时隐藏主窗体 然后在第二个窗体关闭时取消隐藏主窗体 基本上我想在两种形式之间 切换 到目前为止我有 在我的主要形式中 pr
  • 优雅地终止 WCF 服务 - 完成所有打开的会话并限制新会话

    我有一个我编写的 WCF 服务 它托管在 Windows 服务中 它以 PerSession 模式运行 该服务允许客户端通过该服务远程打开文件 更改文件以及关闭文件 到目前为止一切工作都非常顺利 当 Windows 服务停止时 我希望能够让
  • 使用 None 值从 Python int 列表初始化 numpy 掩码数组

    正如问题的答案所示将具有 None 值的 python 列表转换为具有 nan 值的 numpy 数组 https stackoverflow com questions 19456239 convert python list with
  • 如何在Dialog中使用数据绑定?

    我在对话框中实现数据绑定时遇到问题 是否可以 下面是我的 xml
  • Angular UI Bootstrap Modal - 如何防止用户交互

    在我当前的用例中 我尝试使用 Angular ui 模态窗口来显示我们在后台进程中执行的计算进度 我们在完成后禁用该进程 一切运作良好 我只想禁止用户单击背景中的任何元素 知道我们该怎么做吗 打开模态窗口时 您可以传递以下选项 以防止用户关
  • 如何在服务器控件属性中使用 ASP.NET <%= 标记?

    这有效 span value span 这不起作用
  • 如何将 PHP 会话数据保存到数据库而不是文件系统中?

    我有两个网站 一个是 TLS 一个不是 两个都适用于同一个客户端 但我需要这些网站彼此 并且仅彼此 共享通用数据users orders accounts etc 这通常可以通过以下方式完成 SESSION数据 但我显然这些不能跨其他站点工
  • 如何在 CarPlay 中显示“正在播放”选项卡?

    我正在开发一个支持 CarPlay 的应用程序 这是一个音频应用程序 我可以显示 2 个选项卡 最喜欢的和推荐的 但我只是不知道如何显示 正在播放 选项卡 我只是找不到任何有关此的信息 我是否必须手动显示它 以及如何推送 我必须手动完成吗
  • Python 和 Postgresql:操作错误:fe_sendauth:未提供密码

    我知道 StackOverflow 上有很多类似的问题 但我已经阅读并重新阅读了它们 但我似乎无法解决我的特定问题 我正在开发一个使用 Peewee 和 Psycopg2 访问 PostGresQL 数据库的 Python 应用程序 这一切
  • 无法构建 Objective-C 模块“Firebase”

    我收到此错误的原因是import Firebase 无法构建 Objective C 模块 Firebase Xcode 还抱怨 FirebaseAnalytics 说 找不到 FirebaseAnalytics FirebaseAnaly
  • rvest open.connection(x, "rb") 中出现错误:已达到超时

    我正在尝试从中抓取内容http google com http google com 错误信息就出来了 library rvest html http google com open connection x rb 中的错误 已达到超时另外
  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • 自动打开命名管道和 tcp\ip

    我正在安装一个需要修改 SQL Server 的新产品 具体来说 启用 tcp ip 并打开命名管道 我知道如何手动完成 我想要的是一种通过 SQL 或 C 代码为新客户自动化执行此操作的方法 我希望有任何关于正确方向的建议 您可以使用 C
  • 在绘图中的所有坐标之间绘制线条

    我有以下数据框 data lt data frame x c 5 1 3 2 5 7 12 y c 5 7 6 1 3 5 6 我可以使用 ggplot 函数绘制这些坐标 并在这些坐标之间画一条线 ggplot data aes x y g
  • 在 firebase 中,使用单独的端点对多对多关系进行建模是一个好主意吗?

    假设我有一个典型的用户和组数据模型 其中用户可以属于多个组 并且一个组可以拥有多个用户 在我看来 Firebase 文档 https www firebase com docs web guide structuring data html