在 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 集合中删除。