在Firebase中建模三向多对多关系

时间:2017-06-05 15:38:02

标签: firebase firebase-realtime-database many-to-many nosql

我目前正在开发一个体育统计应用,我正在调查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 = asport_key = b服务器端进行过滤。我可以获得一个国家的所有地区,并按体育客户端进行过滤(反之亦然),但这不是一个非常优雅(或可扩展)的解决方案。

我想了几个解决方案:

  • 向每个区域添加复合国家/运动密钥,例如"country_key:sport_key": "-Kl9JB-XRzZyz_GkRiW8:-Kl9JB-XRzZyz_GkA83b"
  • 添加新实体sports_countries,并让每个区域指向其中一个实体。

当然,这只是我整个模型的一部分。完整模式有更多的关系,例如地区有比赛,国家有俱乐部,俱乐部有球队,球队参加比赛,球员参加比赛等等。

你如何在Firebase中解决这个问题?或者,同时查看数据模型的其余部分,您是否会告诉我应该使用关系数据库而不是Firebase?

1 个答案:

答案 0 :(得分:2)

对于三向关系,您可以合并country_keysports_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有更多见解。