预订应用程序的Firestore数据建模,可轻松查询可用性

时间:2018-10-30 16:34:19

标签: firebase database-design google-cloud-firestore google-cloud-functions

在以下情况下,我想请教有关Cloud Firestore数据结构最佳实践的建议。

有一个预订/约会应用程序。酒店出租房间。每个酒店都有多个房间。客户可以在特定日期按空房搜索所有酒店的客房。

在Firestore中构造可用性数据的最佳方法是什么,这样我就可以创建所有酒店中所有可用房间的视图。

我想到了创建一个单独的集合,在该集合中,我将所有引用保留room IDdate的保留放入。但是,由于Firestore无法执行“不等于”查询,因此我似乎无法以这种方式搜索可用的广告位。

所以我想为每个房间创建一个数组字段,其中包含所有可用日期作为时间戳。这产生了另一个问题。即使我可以使用“ array_contains”查询,但用户无法通过这种方式检查可用性超过一天,因为“ array_contains”每个查询只能使用一次。

在这种情况下,最有效的数据结构方式是什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

在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的常见做法。为了更好地理解,我建议您观看此视频Denormalization is normal with the Firebase Database。它用于Firebase实时数据库,但相同的原理也适用于Cloud Firestore。

此外,在复制数据时,需要记住一件事。用与添加数据相同的方式,您需要对其进行维护。换句话说,如果您想更新/删除项目,则需要在它存在的每个位置进行。

使用此数据库架构,您只需在availabeRooms引用上附加一个侦听器并获取所有房间对象,即可简单地查询数据库以获取所有酒店的所有可用房间。如果要获取与特定房间分开的酒店的详细信息,则需要拨打额外电话以获取酒店的详细信息。我已经在房间对象中存储了旅馆对象的引用,如您所见,hotelId。您还可以存储整个hotel对象,但是在做出决定之前,建议您注意一些可以从此 post 的答案中找到的细节。 / p>

此外,如果房间不可用,只需将available下的rooms -> hotelId -> hotelRooms -> roomId属性的值更改为false,然后从availabeRooms集合中删除相应的房间。就是这样!

P.S。如果要获取单个酒店中的所有可用客房,只需在rooms -> hotelId -> hotelRooms上附加一个侦听器,然后使用如下所示的查询获取所有可用客房:

Query query = db.collection("rooms").document(hotelId)
        .collection("hotelRooms").whereEqualTo("available", true);

编辑:

根据您对预订日期的评论,您应该分别为每个房间创建一个预订日历。然后,只需在Cloud Function中创建一个可以使用cron作业触发的函数即可。此功能可以帮助您每天检查每个房间的可用性。如果房间可用,请将available设置为true,否则,将属性设置为false并从availabeRooms集合中删除房间。