在以下情况下,我想请教有关Cloud Firestore数据结构最佳实践的建议。
有一个预订/约会应用程序。酒店出租房间。每个酒店都有多个房间。客户可以在特定日期按空房搜索所有酒店的客房。
在Firestore中构造可用性数据的最佳方法是什么,这样我就可以创建所有酒店中所有可用房间的视图。
我想到了创建一个单独的集合,在该集合中,我将所有引用保留room ID
和date
的保留放入。但是,由于Firestore无法执行“不等于”查询,因此我似乎无法以这种方式搜索可用的广告位。
所以我想为每个房间创建一个数组字段,其中包含所有可用日期作为时间戳。这产生了另一个问题。即使我可以使用“ array_contains”查询,但用户无法通过这种方式检查可用性超过一天,因为“ array_contains”每个查询只能使用一次。
在这种情况下,最有效的数据结构方式是什么?
谢谢!
答案 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
集合中删除房间。