如何使用活动记录存储多个日期范围

how to store many date range with active record

我正在为酒店开发一个预订系统,owners 可以在其中编辑 Room 个时间表。

为了在 Room 不可用 时存储日期,我的第一直觉是 table Occupancy:

Occupancy.create from: "01-04-2022", to: "31-05-2022", room: @room
Occupancy.create from: "15-04-2022", to: "15-05-2022", room: @room

我最终会重叠 Occupancies,但没关系。

但是现在,我希望owner能够选择在四月的第一个周末Room空缺

而且我不知道如何使用此模式执行此操作,除非创建另一个 table,或向 Occupancy 添加一列。

所以,我正在考虑在 Room table 的列中存储占用日期的数组,可能使用 json 格式。

但我觉得当我需要查询给定时间段内的可用房间时,我可能会遇到困难。

听起来不适合这项工作。

我过去曾开发过一个预订系统,该系统的建模与您当前的方法类似,并且运行良好。我们有一个相当于 OccupanciesBookingsInternalHolds 的第二个 table 用于您描述的用例,以及清洁等其他任务或维护。

这在很长一段时间内都运行良好。最终,我们最终提取了可预订日历天数的非规范化 table,但它是从预订和保留中派生的。

在更大的规模和更长的时间范围内,您最终可能会在 Postgres 之外拥有一些专用的搜索基础设施(想想地理搜索、便利设施过滤和 full-text 搜索),这将需要这种反规范化无论如何。

我会犹豫直接跳到 JSON 列方法,因为查询会更加棘手。对于很多查询,您要么被困在写棘手的 non-portable SQL 中;要么或加载所有房间的每次入住情况,以便能够随时回答“从星期二开始有哪些房间可供入住 3 晚”之类的查询。