Моделирование данных Firestore для приложения бронирования для удобных запросов доступности - PullRequest
0 голосов
/ 30 октября 2018

Я хотел бы попросить совета по рекомендациям по структурированию данных для Cloud Firestore для следующего сценария.

Есть приложение для бронирования / встречи. Гостиницы сдают комнаты. В каждом отеле несколько номеров. Клиенты могут искать номера всех отелей по наличию в определенные дни.

Каков наилучший способ структурировать данные о доступности в Firestore, чтобы я мог создавать просмотр всех доступных номеров во всех отелях.

Я думал о создании отдельных коллекций, в которые я поместил бы все резервирования, ссылающиеся на room ID и date резервирования. Однако, похоже, что я не смогу искать доступные слоты таким образом, поскольку Firestore не может выполнять запросы «не равно».

Поэтому я подумал, что создам поле массива для каждой комнаты, содержащее все доступные даты в качестве временных отметок. Это создает еще одну проблему. Несмотря на то, что я могу использовать запрос 'array_contains', пользователи не могут таким образом проверять доступность более одного дня, так как 'array_contains' может использоваться только один раз для запроса.

Каков наиболее эффективный способ структурирования данных в этом случае?

Спасибо!

1 Ответ

0 голосов
/ 31 октября 2018

Каков наилучший способ структурировать данные о доступности в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...