构建Firebase中的关系

时间:2015-01-12 15:22:03

标签: firebase relationship denormalization

我的Firebase中有两个项目:providersservices,我正在尝试找出使用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": {...
    }
  }
}

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

提前致谢!

1 个答案:

答案 0 :(得分:11)

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"
  }
}

这种方法有利有弊:

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

N

  • 您已加载整个数据集。 Firebase不允许您在密钥内过滤,客户端必须加载整个列表,然后在内存中过滤。我怀疑这对于数百条记录都可以正常工作,无论如何,可能只有数千条记录。
  • 您必须做一些客户端工作来过滤列表以进行显示,并将其与实际服务和提供者数据合并。同样,如果数据集不是太大,那么下划线/ lodash groupBy()可以简化这个工作。

你应该考虑:

  • 你会做多少更新和删除?
  • 加入信息真的那么简单吗?您是否需要更多记录(显示名称,价格等),使连接表上的维护比我建议的更复杂?