优化预订系统的可用性检查

问题描述 投票:0回答:1

我正在开发资源预订系统,需要有关优化检查资源可用性逻辑的建议。当前的实现可以工作,但感觉效率低下,因为它执行了不必要的检查。

场景如下:

  1. 我在
    resourceList
    中存储了资源列表(例如设备、房间或任何可预订的项目)。
  2. 每个资源可以有多个预订,存储在
    bookingList
    中。
  3. 当收到预订请求时,我需要检查请求的日期是否与该资源的任何现有预订重叠。如果资源可用,我会将其添加到已确认的预订列表中。 每个预订都有开始日期和结束日期。

这是我当前的代码:

// Sample resource list
const resourceList = [
  { resourceId: "R1", status: "Available" },
  { resourceId: "R2", status: "Booked" },
  { resourceId: "R3", status: "Booked" }
];

// Sample booking list
const bookingList = [
  { resourceId: "R2", startDate: "2025-01-10", endDate: "2025-01-15" },
  { resourceId: "R2", startDate: "2025-01-20", endDate: "2025-01-25" },
  { resourceId: "R3", startDate: "2025-01-12", endDate: "2025-01-18" }
];

// Requested dates
const startDate = new Date("2025-01-15");
const endDate = new Date("2025-01-19");

let availableResources = [];
let newBookings = [];
const requiredResources = 1; // Example: Only need 1 resource

for (let resource of resourceList) {
  if (resource.status === "Booked") {
    const resourceBookings = bookingList.filter(
      booking => booking.resourceId === resource.resourceId
    );

    // Check if the resource is available for the requested dates
    const isAvailable = resourceBookings.every(booking => {
      const existingStart = new Date(booking.startDate);
      const existingEnd = new Date(booking.endDate);

      return endDate < existingStart || startDate > existingEnd;
    });

    // Add resource if available and limit not met
    if (isAvailable && availableResources.length < requiredResources) {
      availableResources.push(resource.resourceId);
      newBookings.push({
        resourceId: resource.resourceId,
        startDate: startDate.toISOString().split("T")[0],
        endDate: endDate.toISOString().split("T")[0]
      });
    }
  }
}

我的担忧:

  • 不必要的检查:我觉得检查每个预订不应该是这样,有更好更有效的方法来仅检查预订的子集吗?
  • 性能问题:随着资源和预订数量的增长,这种方法可能无法很好地扩展。

如果您解决了类似的问题或有任何想法,我很想听听!

提前感谢您的建议。

javascript optimization
1个回答
0
投票

关于您提到的两个问题,您都是正确的。 如果保留的预订数量“相当小”,那么像这样检查所有预订可能就可以了。 上下文就是一切。

大规模释放更好性能的关键是使用排序数据。 考虑一下,如果我给了您一排 10,000 张用于预订的索引卡,并且它们按开始日期“排序”。 而且我让你看看2026年6月5日-7日有没有空位。那么只有2个步骤,会非常快:

查找6月5日之前最晚结束的预订
  1. 查看下一次预订并确保是 6 月 8 日或以上
  2. 因此,您没有提及您的数据的保存方式/位置。 如果它被保存在“内存”的某个地方,它可以通过几个数据结构按排序顺序保存/维护。 您要避免的事情之一是每次您想查看时都重新排序预订。

如果你能做到这一点,那么确定可用性的算法是:

使用二分查找查找前一个结束的预订
  1. 检查下一个预订是否在请求之后开始
二分查找

是在排序数据中定位正确位置的最有效方法。 它易于实现,并保证 O(log(n)) 性能。

© www.soinside.com 2019 - 2024. All rights reserved.