我目前正在开发一个体育统计应用,我正在调查Firebase是否/如何处理我需要的数据和关系。
由于Firebase似乎不支持相当于WHERE a = x AND b = y
,因此我不确定对我的用例有什么好处/最佳方法。
我的系统中有以下实体:
将会有一个页面,您可以在其中选择国家/地区和运动,并显示区域列表。
对于乡村和体育来说,这似乎很容易:
{
"countries": {
"-Kl9JB-XRzZyz_GkRiW8": {
"name": "The Netherlands"
}
},
"sports": {
"-Kl9JB-XRzZyz_GkA83b": {
"name": "football"
}
}
}
但是地区怎么样?由于一个地区与一个国家和一项运动联系在一起,这样的事情似乎是合乎逻辑的:
{
"regions": {
"-Kl9JB-XRzZyz_GkRiWa": {
"name": "West",
"country_key": "-Kl9JB-XRzZyz_GkRiW8",
"sport_key": "-Kl9JB-XRzZyz_GkA83b"
}
}
}
但是,这会导致问题,因为据我所知,我无法查询db.ref().child('regions')
,然后按country_key = a
和sport_key = b
服务器端进行过滤。我可以获得一个国家的所有地区,并按体育客户端进行过滤(反之亦然),但这不是一个非常优雅(或可扩展)的解决方案。
我想了几个解决方案:
"country_key:sport_key": "-Kl9JB-XRzZyz_GkRiW8:-Kl9JB-XRzZyz_GkA83b"
sports_countries
,并让每个区域指向其中一个实体。当然,这只是我整个模型的一部分。完整模式有更多的关系,例如地区有比赛,国家有俱乐部,俱乐部有球队,球队参加比赛,球员参加比赛等等。
你如何在Firebase中解决这个问题?或者,同时查看数据模型的其余部分,您是否会告诉我应该使用关系数据库而不是Firebase?
答案 0 :(得分:2)
对于三向关系,您可以合并country_key
和sports_key
(不建议超过2个)。
{
"regions": {
"-Kl9JB-XRzZyz_GkRiWa": {
"name": "West",
"combined_key": "-Kl9JB-XRzZyz_GkRiW8-Kl9JB-XRzZyz_GkA83b"
}
}
}
然后一起查询:
...ref("regions").orderBy("combined_key").equalTo(country_key + sports_key)
同样,如果您尝试按两个以上的字段进行过滤,则不建议这样做,但对于2来说效果很好。
此question有更多见解。