Я хочу не добавлять геошиши в ресторан документов, поскольку документ может быть во много раз больше, чем должен быть.
Да, не делайте этого, потому что документы имеют ограничения,Таким образом, существуют некоторые ограничения в отношении объема данных, которые вы можете поместить в документ.Согласно официальной документации, касающейся использования и ограничений :
Максимальный размер документа: 1 МБ (1 048 576 байт)
Как видно, вы ограничены 1 МБ данных в одном документе.Когда мы говорим о сохранении текста, вы можете хранить в значительной степени, но если вы используете сложные объекты, это не вариант.
Первоначальная идея состоит в том, чтобы все геохешы были в подколлекцииресторанный документ, но я обнаружил, что невозможно выполнить запросы при подборе документов.
Это хорошее решение.Структура вашей базы данных должна выглядеть следующим образом:
Firestore-root
|
--- restaurants (collection)
|
--- restaurantId (document)
|
--- geohashes (collection)
|
--- geohashId (document)
|
--- //details about the location
Таким образом, запрос, который может позволить вам получить все geohash
объекты определенного ресторана, будет работать отлично.
Вторая идея заключалась в том, чтобы извлечь геошашки на верхний уровень в коллекции областей доставки.
Не плохое решение, но вы должны создать дополнительный get()
звонок, чтобы получить информацию о ресторане, но даже еслиЭто неплохой вызов, нет проблем с вложенными запросами в Firestore.Нет необходимости в операции OR
.
Редактировать: Согласно вашему комментарию, да, вы правы, вы не можете запросить базу данных, чтобы вернуть объекты ресторана, но мы имеем здесьработа вокруг тоже.В этом случае вам следует подумать об увеличении структуры данных, чтобы разрешить обратный поиск, добавив новую коллекцию, подобную этой:
Firestore-root
|
--- geohashes (collection)
|
--- geohashId (document)
|
--- geohashRestaurants (collection)
|
--- restaurantId
|
--- //restaurant details
Этот метод называется denormalization
, что, как вы видите, подразумевает дублирование данных.Но вы должны знать, что нет проблем с дублированием данных, когда речь идет о Firebase.Это довольно распространенная практика, и для этого я рекомендую вам посмотреть это видео, Денормализация нормальна для базы данных Firebase .Предназначен для баз данных реального времени Firebase, но тот же принцип применим и к Cloud Firestore.
Когда вы дублируете данные, есть одна вещь, которую нужно иметь в виду.Точно так же, как вы добавляете данные, вы должны поддерживать их.Другими словами, если вы хотите обновить / обнаружить элемент, вы должны делать это в каждом месте, где он существует.