在 Firebase 中构建关系
Structuring Relationships in Firebase
我的 Firebase 中有两个项目:providers
和 services
,我正在尝试找出使用 Firebase 推荐的扁平化架构方法构建和建立关系的最佳方式。
我的数据看起来像这样:
{
"services" : {
"hip_replacement" : {
"title" : "Hip Replacement"
}
},
"providers" : {
"the_blue_hospital" : {
"title" : "The Blue Hospital"
}
}
}
我想link将这两个项目放在一起,这样如果您要访问髋关节置换页面,蓝色医院就会显示在它下面,如果您要访问蓝色医院页面,髋关节替换会出现在它下面。本质上是双向关系。
构造这样的东西的最佳方式是什么?我的思路是这样的:
{
"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 中连接数据的问题是您以牺牲其他用例为代价来优化某些读取或更新用例。在上面的示例中,创建或删除服务和提供者之间的关系需要对每个 "table" 进行两次单独的更新。这确实没什么问题,但这不是唯一的方法。
对于中等大小的数据集,您可以有一个 "join table" 将服务映射到提供者,类似于关系数据库世界中可能做的事情。数据可能如下所示:
{
"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"
}
}
这种方法有利有弊:
专业版
- 易于在一处添加映射
- 轻松删除一处映射
- 重新格式化数据以供显示的灵活选项,超出单个提供程序或服务的上下文,例如索引。
Con
- 您已加载整个数据集。 Firebase 不允许您在键内进行过滤,客户端必须加载整个列表,然后在内存中进行过滤。我怀疑这对于数百条记录都可以正常工作,无论如何,可能只有几千条记录。
- 您必须做一些客户端工作来过滤要显示的列表并将其与实际服务和提供商数据合并。同样,如果数据集不是太大,underscore/lodash groupBy() 可以缩短这个时间。
你应该考虑:
- 你会做多少更新和删除?
- 加盟信息真的那么简单吗?您是否需要更多记录(显示名称、价格等),从而使连接维护 table 比我建议的更复杂?
我的 Firebase 中有两个项目:providers
和 services
,我正在尝试找出使用 Firebase 推荐的扁平化架构方法构建和建立关系的最佳方式。
我的数据看起来像这样:
{
"services" : {
"hip_replacement" : {
"title" : "Hip Replacement"
}
},
"providers" : {
"the_blue_hospital" : {
"title" : "The Blue Hospital"
}
}
}
我想link将这两个项目放在一起,这样如果您要访问髋关节置换页面,蓝色医院就会显示在它下面,如果您要访问蓝色医院页面,髋关节替换会出现在它下面。本质上是双向关系。
构造这样的东西的最佳方式是什么?我的思路是这样的:
{
"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 中连接数据的问题是您以牺牲其他用例为代价来优化某些读取或更新用例。在上面的示例中,创建或删除服务和提供者之间的关系需要对每个 "table" 进行两次单独的更新。这确实没什么问题,但这不是唯一的方法。
对于中等大小的数据集,您可以有一个 "join table" 将服务映射到提供者,类似于关系数据库世界中可能做的事情。数据可能如下所示:
{
"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"
}
}
这种方法有利有弊:
专业版
- 易于在一处添加映射
- 轻松删除一处映射
- 重新格式化数据以供显示的灵活选项,超出单个提供程序或服务的上下文,例如索引。
Con
- 您已加载整个数据集。 Firebase 不允许您在键内进行过滤,客户端必须加载整个列表,然后在内存中进行过滤。我怀疑这对于数百条记录都可以正常工作,无论如何,可能只有几千条记录。
- 您必须做一些客户端工作来过滤要显示的列表并将其与实际服务和提供商数据合并。同样,如果数据集不是太大,underscore/lodash groupBy() 可以缩短这个时间。
你应该考虑:
- 你会做多少更新和删除?
- 加盟信息真的那么简单吗?您是否需要更多记录(显示名称、价格等),从而使连接维护 table 比我建议的更复杂?