通过多级“后向指针”进行Firestore查询?

时间:2018-10-05 13:50:06

标签: google-cloud-firestore

我们很难在Cloud Firestore中找到一种有效的方法来处理以下问题,并且将不胜感激所有建议!

我们有一棵深层次树,假设有文档A,B,C和D。A包含一些B,其中B包含C,而C包含D。每个文档都有用于其子集合的字段,以及在树中指向其父项的引用“后向指针”。因此,您可以像A.B.C.D一样沿着树下走,然后还可以通过概念上的D.C.B.A.来将树恢复到A。

我们遇到的问题是,我们需要有效地查询“ A中的所有D”。理想情况下,我们可以在概念上做类似select all D where D.C.B.A = 'some A'的事情。

有效处理此问题的最佳方法是什么?此时,我们愿意在必要时获得一些帮助,因为这是我们应用程序的核心用例,并且在Cloud Firestore中还没有找到任何可行的解决方案。

我们很难在Cloud Firestore中找到一种有效的方法来处理以下问题,并且将不胜感激所有建议!

我们有一棵深层次树,假设有文档A,B,C和D。A包含一些B,其中B包含C,而C包含D。每个文档都有用于其子集合的字段,以及在树中指向其父项的引用“后向指针”。因此,您可以像A.B.C.D一样沿着树下走,然后还可以通过概念上的D.C.B.A.来将树恢复到A。

我们遇到的问题是,我们需要有效地查询“ A中的所有D”。理想情况下,我们可以在概念上做类似select all D where D.C.B.A = 'some A'的事情。

有效处理此问题的最佳方法是什么?此时,我们愿意在必要时获得一些帮助,因为这是我们应用程序的核心用例,并且在Cloud Firestore中还没有找到任何可行的解决方案。

很抱歉,您可以使用通用字母叠加汤。我们的数据模型很大而且很复杂,我试图避免陷入困境(并发布不允许的代码/模型)。但是我至少可以给出一个更好的类比。此地理模型伪代码与我们的用例非常相似:

class Country
{
    List<State> states;
    President currentPresident;
}

class State
{
    List<City> cities;
    Country parentCountry;
    string governor;
}

class City
{
    List<Person> persons;
    State parentState;
    string mayor;
}

class Person
{
    City city;
    string name;
}

然后,我们需要能够运行以下查询:
-“让所有居住在X国的人”
-“让所有人民生活在Y市长管辖的城市中”

理想情况是能够说“选择City.State.Country =='someCountry'的所有人”。

我们意识到我们可以将引用拼合为Person。但是,我们有大量(而且可能还会增加)用于通过不同标准“切片和切块”人员的引用。而且,如果有数以千万计的人(在我们的实际数据库中就是这种情况),那么所有这些扁平化的引用似乎都不高效。以我们的类比,诸如州或国家之类的东西不只是一个字符串或简单的对象,它会有许多字段,这些字段可能用于 过滤人员。

只要它意味着更好的Firestore性能,只要它并不意味着完全打破数据的直观且可维护的组织,我们就愿意对模型进行重组。

再次感谢您的想法!

1 个答案:

答案 0 :(得分:0)

  

“然后我们需要能够运行以下查询:   -“让所有居住在X国的人”   -“让所有人民生活在Y市长管辖的城市中””

这样重塑一下

创建许多Person集合,称为:

- PersonCity
- PersonCountry
- PersonState

我认为扁平化是关键,而云中的空间便宜。 然后,在创建一个人时,必须两次保存一些数据

另一种想法是,这取决于查询的复杂程度,例如查询是否仅包含一个或多个字段,则像这样创建Collections

- PersonQueryOneField
   - Name "oskar"
   - City "miami"


- PersonQueryTwoField
   - Name "oskar"
   - City "miami"
   - Country "usa"


- PersonQueryThreeField
   - Name "oskar"
   - City  "miami"
   - Country "usa"
   - State "florida"

- PersonQueryTenField
   - Name "oskar"
   - City  "miami"
   - Country "usa"
   - State "florida"
   - Age   "7"
   - Length "98cm"
   - Gender "boy"
   - Extra1  "na"
   - Extra2  "na"
   - Extra3  "na"

也许PersonQueryTwoField上的大多数查询都可以更快地获取数据,

空间便宜!

只是一个想法!