firebase - 用于预订应用程序的 Firestore 数据建模,便于查询可用性
问题描述
我想就以下场景的 Cloud Firestore 数据结构最佳实践寻求建议。
有一个预订/预约应用程序。酒店出租房间。每家酒店都有多个房间。客户可以根据特定日期的空房情况搜索所有酒店的房间。
在 Firestore 中构建可用性数据的最佳方法是什么,以便我可以创建所有酒店中所有可用房间的视图。
我想创建一个单独的集合,在其中放置所有引用room ID
和date
的保留。但是,我似乎无法以这种方式搜索可用插槽,因为 Firestore 无法执行“不等于”查询。
所以我想我会为每个房间创建一个数组字段,其中包含所有可用日期作为时间戳。这产生了另一个问题。即使我可以使用“array_contains”查询,用户也不能以这种方式检查可用性超过一天,因为每个查询只能使用一次“array_contains”。
在这种情况下,构建数据的最有效方法是什么?
谢谢!
解决方案
在 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
而已!
PS 如果您想获取单个酒店内的所有可用房间,只需附加一个侦听rooms -> hotelId -> hotelRooms
器并使用如下所示的查询获取所有可用房间:
Query query = db.collection("rooms").document(hotelId)
.collection("hotelRooms").whereEqualTo("available", true);
编辑:
根据您对预订日期的评论,您应该为每个房间分别创建一个预订日历。然后只需在 Cloud Function 中创建一个可以使用 cron 作业触发的函数。此功能可以帮助您每天查看每个房间的空房情况。如果房间可用,则将 设置available
为true
否则,将属性设置为false
并将房间从availabeRooms
集合中删除。
推荐阅读
- python - 隐藏的堆叠 LSTM 层是如何互连的?Python
- python - 如何优化嵌套循环,包括用于计算 IVOL 的大量回归?
- python - ValueError:x 和 y 必须具有相同的第一维,但具有形状 (1, 2) 和 (2,)
- php - 按字母顺序排列数组
- html - 在图像上使用 CSS object-fit:contain 会在其周围留下空白
- javascript - 在我的点击事件中,只有一个复选框事件有效,但其他未检查
- javascript - 删除请求 API Axios Vue.js
- c - 将 C 编译为机器语言并在 Python 中导入
- php - 如何在 PHP 中为 MSSQL 使用未准备好的语句
- python - 使用 List 作为搜索变量的 Python RegEx