热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在firebase中,使用单独的端点建模许多关系是一个好主意吗?》经验,为你挑选了1个好方法。

假设我有一个典型的用户和组数据模型,其中用户可以在多个组中,一个组可以有许多用户.在我看来,firebase文档建议我通过在组内部复制用户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> Frank van Pu..:

在您提出的设计中,您总是需要访问三个位置来向用户和她的群组展示:

    users孩子来确定用户的属性

    memberships确定她就是团体中的一员

    groups孩子确定组的属性

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

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

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

目前,我会选择一个辅助流程来定期扫描数据并协调它找到的任何不规则数据.当然,这也意味着常规客户端代码需要足够健壮以处理这种不规则数据(例如,指向用户的组,其中该用户的记录不指向该组).

或者,您可以设置一些高级.validate规则,以确保双方始终保持同步.我总是发现需要更多时间来实现,所以从不打扰.

您可能还想阅读此答案:Firebase数据结构和网址


推荐阅读
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 前面刚有AWS开战MongoDB,双方“隔空互呛”,这厢又曝出2亿+简历信息泄露——MongoDB的这场开年似乎“充实”得过分了些。长期以来,作为“最受欢迎的NoSQL数据库”,M ... [详细]
  • 数据库基本介绍
    1、数据库基本知识概念:数据库:database(DB),是一种存储数据的仓库数据库是根据数据结构组织、存储和 ... [详细]
  • hackingTeam是如何被黑的
    hackingTeam是如何被黑的 ... [详细]
  • 什么是堡垒机?堡垒机是一个主机系统,其自身通常经过了一定的加固,具有较高的安全性,可抵御一定的攻击,其作用主 ... [详细]
  • 在Ubuntu中安装MongoDB
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • MySQL:互联网公司常用 分库分表
    本文目录一、数据库瓶颈IO瓶颈CPU瓶颈二、分库分表水平分库水平分表垂直分库垂直分表三、分库分表工具四、分库分表步骤五、分库分表问题非partit ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 《Python3 网络爬虫开发实战》:高效实用的 MongoDB 文档存储
    NoSQL,全称NotOnlySQL,意为不仅仅是SQL,泛指非关系型数据库。NoSQL是基于键值对的,而且不需要经过SQL ... [详细]
  • 目录一、MySQL数据库1.简介2.用管理员身份登录3.密码相关操作4.SQL与NoSQL5.数据库重要概念二、MySQL基本语句1.基于库的增删改查2.基于表的增删改查3.基于记 ... [详细]
author-avatar
可以吸的果冻Ci
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有