【问题标题】:Firestore query by multi-level 'back pointer'?Firestore 通过多级“后向指针”查询?
【发布时间】:2018-10-05 13:50:06
【问题描述】:

我们很难找到有效的方法来处理 Cloud Firestore 中的以下问题,非常感谢任何和所有建议!

我们有一个深度层次树,假设有文档 A、B、C 和 D。A 包含一些 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' 的事情。

有效处理此问题的最佳方法是什么?如有必要,我们愿意在这一点上进行 hack-ish,因为这是我们应用的核心用例,我们尚未在 Cloud Firestore 中找到任何可行的解决方案。

我们很难找到有效的方法来处理 Cloud Firestore 中的以下问题,非常感谢任何和所有建议!

我们有一个深度层次树,假设有文档 A、B、C 和 D。A 包含一些 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' 的事情。

有效处理此问题的最佳方法是什么?如有必要,我们愿意在这一点上进行 hack-ish,因为这是我们应用的核心用例,我们尚未在 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。但是我们有大量(并且可能会增加)用于按不同标准“切片和切块”Person 的引用。如果有数千万或数亿人(就像我们真实数据库中的情况),那么所有这些扁平化的引用似乎都没有效率。在我们的类比中,像 State 或 Country 这样的东西不会只是一个字符串或简单的对象,它会有很多字段,可以潜在地用于 过滤人员。

如果这意味着更好的 Firestore 性能,我们愿意重新组织我们的模型,只要这并不意味着完全破坏数据的直观和可维护的组织。

再次感谢您的想法!

【问题讨论】:

标签: google-cloud-firestore


【解决方案1】:

“然后我们需要能够运行如下查询: - “让所有住在 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 上的大多数查询,那么获取数据会更便宜,

空间很便宜!

只是一个想法!

【讨论】:

  • 这是一个有趣的想法。我们将不得不考虑一些。在我们的例子中,Person 的等价物是大容量(数千万或数亿“行”),所以即使使用廉价的存储,这仍然看起来有点吓人。但我们肯定会考虑所有选项。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
相关资源
最近更新 更多