Каков наилучший способ структурировать данные о доступности в Firestore, чтобы я мог создавать просмотр всех доступных номеров во всех отелях.
Возможная структура базы данных, которая может помочь вам достичь того, чего вы хотите, может быть такой:
Firestore-root
|
--- hotels (collection)
| |
| --- hotelId (document)
| |
| --- //Hotel properties
|
|
--- rooms (collection)
| |
| --- hotelId (document)
| |
| --- hotelRooms (collection)
| |
| --- roomId (document)
| |
| --- available: true
| |
| --- hotel: "hotelId"
| |
| --- //Other room properties
|
|
--- availabeRooms (collection)
|
--- roomId (document)
|
--- available: true
|
--- hotel: "hotelId"
|
--- //Other room properties
Как вы, наверное, видите, у меня есть дубликаты некоторых данных для достижения того, что вы хотите. Эта практика называется denormalization
и является обычной практикой, когда дело доходит до Firebase. Для лучшего понимания я рекомендую вам посмотреть это видео, Денормализация нормальна с базой данных Firebase . Это для базы данных реального времени Firebase, но те же принципы применимы к Cloud Firestore.
Кроме того, когда вы дублируете данные, следует помнить одну вещь. Точно так же, как вы добавляете данные, вы должны поддерживать их. Другими словами, если вы хотите обновить / обнаружить элемент, вы должны делать это в каждом месте, где он существует.
Используя эту схему базы данных, вы можете просто запросить базу данных, чтобы получить все доступные номера из всех отелей, прикрепив прослушиватель по ссылке availabeRooms
и получить все объекты комнаты. Если вы хотите получить подробную информацию об отеле, в котором находится отдельный номер, вам нужно сделать дополнительный звонок, чтобы получить информацию об отеле. Я сохранил в объекте помещения только ссылку на объект отеля, который, как вы можете видеть, hotelId
. Вы также можете хранить весь объект hotel
, но прежде чем принимать решение, я рекомендую вам ознакомиться с некоторыми деталями, которые можно найти в моем ответе из этого сообщения .
Кроме того, если комната становится недоступной, просто измените значение свойства available
, существующего в rooms -> hotelId -> hotelRooms -> roomId
, на false
и удалите соответствующую комнату из коллекции availabeRooms
. Вот и все!
P.S. Если вы хотите получить все доступные номера в одном отеле, просто подключите слушателя на rooms -> hotelId -> hotelRooms
и получите все доступные номера, используя запрос, который должен выглядеть следующим образом:
Query query = db.collection("rooms").document(hotelId)
.collection("hotelRooms").whereEqualTo("available", true);
Edit:
Согласно вашему комментарию относительно даты бронирования, вы должны создать календарь бронирования для каждого номера отдельно. Затем просто создайте функцию в Cloud Function, которая может быть запущена с помощью задания cron. Эта функция может помочь вам ежедневно проверять доступность каждого номера. Если комната доступна, установите для available
значение true
, в противном случае установите для свойства значение false
и удалите комнату из коллекции availabeRooms
.