【问题标题】:Firestore data modeling for a booking app for easy availability queries用于预订应用程序的 Firestore 数据建模,便于查询可用性
【发布时间】:2019-04-03 18:30:47
【问题描述】:

我想就以下场景的 Cloud Firestore 数据结构最佳做法寻求建议。

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

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

我想创建一个单独的集合,在其中放置引用预订的room IDdate 的所有预订。但是,我似乎无法通过这种方式搜索可用插槽,因为 Firestore 无法执行“不等于”查询。

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

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

谢谢!

【问题讨论】:

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


    【解决方案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

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

    附:如果您想获取单个酒店内的所有可用房间,只需在 rooms -> hotelId -> hotelRooms 上附加一个侦听器,然后使用如下所示的查询获取所有可用房间:

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

    编辑:

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

    【讨论】:

    • 嗨阿塔斯克罗夫!你有没有试过我上面的解决方案,它有效吗?
    • 谢谢你,@alex-mamo!你的建议真的很有帮助,它让我想到了不同的方向。但是,您的结构没有考虑预订日期。房间可以一天入住,第二天预订。
    • 哦,我明白了。在这种情况下,请参阅我的更新答案。现在可以了吗?
    • 一切都好吗,我可以帮助您了解其他信息吗?
    • 嗨@AlexMamo,你如何创建上面的firebase数据树?我的意思是您使用任何工具还是只是文本?谢谢
    猜你喜欢
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多