【发布时间】: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 组的其他详细信息。感谢您的见解!