У нас много проблем с поиском эффективного способа решения следующей проблемы в Cloud Firestore, и мы будем очень признательны за любые предложения!
У нас есть глубокое иерархическое дерево, где, скажем, есть документы A, B, C и D. A содержит несколько B, которые содержат C, которые содержат Ds.Каждый документ имеет поля для своей дочерней коллекции, а также ссылку «обратный указатель» на своего родителя в дереве.Таким образом, вы можете перейти вниз по дереву, как ABCD, и затем вы можете также вернуться к дереву к A, концептуально выполняя DCBA
Проблема, с которой мы сталкиваемся, заключается в том, что нам нужно эффективно запрашивать «все DА».В идеале мы могли бы сделать что-то концептуально, например, select all D where D.C.B.A = 'some A'
.
Каков наилучший способ справиться с этим эффективно?Мы готовы получить хакерскую при необходимости, если это необходимо, потому что это основной вариант использования нашего приложения, и мы еще не нашли работоспособного решения в Cloud Firestore.
У нас естьМы найдем много способов найти эффективный способ решения следующей проблемы в Cloud Firestore и будем благодарны за любые предложения!
У нас есть глубокое иерархическое дерево, где, скажем, есть документы A, B, C и D.A содержит несколько B, которые содержат C, которые содержат Ds.Каждый документ имеет поля для своей дочерней коллекции, а также ссылку «обратный указатель» на своего родителя в дереве.Таким образом, вы можете перейти вниз по дереву, как ABCD, и затем вы можете также вернуться к дереву к A, концептуально выполняя DCBA
Проблема, с которой мы сталкиваемся, заключается в том, что нам нужно эффективно запросить «все 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'".
Мы понимаем, что можем сгладить ссылки в Личность.Но у нас есть большое (и потенциально увеличивающееся) количество ссылок, используемых для «разрезания и нарезки» людей по различным критериям.И если есть десятки или сотни миллионов людей (как в нашей реальной базе данных), то все эти сглаженные ссылки не кажутся эффективными.И в нашей аналогии, что-то вроде State или Country не было бы просто строкой или простым объектом, у него было бы много полей, которые потенциально могли бы использоваться для фильтрации Persons.
Мы широко открыты для реорганизации нашей модели, еслиэто означает лучшую производительность Firestore, если это не означает полного нарушения интуитивно понятной и поддерживаемой организации данных.
Еще раз спасибо за ваши мысли!