Является ли дополнительная сложность плоской структуры базы данных в Firebase более эффективной, чем простая .where () в коллекции?Если да, то каков наиболее эффективный способ получить объекты из списка ссылок?
Большинство примеров Firestore, на которые я смотрел, предлагают плоскую структуру для сохранения чтения.Например, если вы хотите получить все рестораны пользователя, создайте третью коллекцию, в которой хранится список ссылок на рестораны.
users
-u1id
restaurants
- r1id
- r2id
userRestaurants
-u1id
-restaurants: [r1id, r2id]
Имеет смысл, но я нашел это обсуждение, которое говорит об обратном: https://github.com/flutter/flutter/issues/17476#issuecomment-426135287
"или (лучший метод) получить ссылку на документ пользователя, а затем выполнить a.где ('user', isEqualTo: userDocRef). Последний позволяет получать все списки покупок одним простым запросом, который быстрее и легче "коллекция "быстрее и легче"?
Если нет, как лучше всего получить список документов?
Примеры, которые я пробовал (пробел вместо ресторана в примерах кода): возвращениесписок потока documentSnapshots
Stream<List<DocumentSnapshot>>getUserSpacesFromId(String uid){
return userSpaceCollection.document(uid).snapshots().asyncMap((snap) async
{
List<dynamic> spaceArr = snap.data['spaces'];
var spaceList = <DocumentSnapshot>[];
for (var path in spaceArr) {
spaceList.add(await spaceCollection.document(path).get());
}
return spaceList;
});
}
или использование Future.wait для цепочки фьючерсов:
Future<dynamic> getUserSpaces(List spaceList) async{
List<Future> futures = [];
for (var id in spaceList){
futures.add(spaceCollection.document(id).get());
}
return Future.wait(futures).then((List documents) =>
documents.map((documentSnapshot) => Space.fromMap(documentSnapshot.data)).toList()
).catchError((error) {
print('error: $error');
return false;
});
}