员工可用性的数据库设计

Database design for employee availability

我正在尝试设计一个系统,让员工声明他们的可用性,然后我就可以搜索这些数据并找出是否存在任何冲突。

员工可以这样设置他们的一般可用性:我从 5 月 1 日到 7 月 22 日从 10:00 到 16:00 有空。

然后他们可以设置例外,例如:我从 5 月 5 日到 5 月 7 日从 14:00 到 16:00 不可用。

我正在考虑将这些声明转换为特定的 10 分钟时间段,为每天和每次创建记录,然后删除声明为不可用的时间段。但是我不确定如何保持数据的一致性。

存储和查询此数据的有效方法是什么?

假设您现有的 Employee table 定义了 EmployeeID,您将创建两个 table,GeneralAvailabilityExemption.

GeneralAvailability
-------------------
GeneralAvailabilityID
EmployeeID
StartDate
EndDate
StartTime
EndTime

其中 GeneralAvailabilityID 是递增整数默认主键。您还可以在 (EmployeID, StartDate desc) 上创建索引。

您可以使用 SELECT 语句查询此 table。

SELECT *
    FROM GeneralAvailability
    WHERE EmployeeID = 'some id'
    AND StartDate <= current date
    ORDER BY EmployeeID, StartDate desc

现在,您可能会检索多行。第一行是包含日期和时间的最新公开发布行。

为了打字方便,我使用了SELECT *。在您的代码中,您将指定要按名称检索的所有列。

Exemption table 将具有相同的结构和略有不同的查询。您的应用程序将为一名员工处理多项豁免。

SELECT *
    FROM Exemption
    WHERE EmployeeID = 'some id'
    AND StartDate >= current date
    ORDER BY EmployeeID, StartDate