数据库架构

Database schema

我有 2 个实体 Office 和 Employee,我想为 WorkingHours 设计数据库架构。有些办公室的员工有默认的工作时间,但有些员工可能有不同的工作时间。

最好的建模方法是什么?我在两个表中都有工作时间吗?

WorkingHours 将是一个不同的实体。

一个办公室有一个默认的工作时间(或者可能不止一个?)。 一名雇员有一个工作小时。员工的工作时间数据取自员工办公室的工作时间。员工的工作时间可以在不改变办公室工作时间的情况下改变。

你可以做的一件事是创建新的 table 工作时间,使其独立于员工

Working hours 

Id  Working Hours
1     10 - 8
2     12- 9

为员工分配 id 值 table

Employee

ID WorkingHoursID
1     2
2     2
3     1

创建三个 Table
1. Office: 这应该是office location, name and Its own ID
2. 时间Table: ID, OfficeID, TimeSLot
3. 员工:在此 table 中创建一个列 OfficeID 并从他或她正在工作的办公室 table 传递办公室 ID,并使用 TimeslotID 和第二个 table 的传递 ID 的其他列。

喜欢 : EmpID, OfficeID,TimeSLotID

您可以做的是创建一个类似于下面的架构。当然,您需要添加额外的列来保存额外的数据(如果有的话),并且还需要使用特定于您正在使用的 RDBMS 的数据类型来调整查询。

CREATE TABLE Office(OfficeID integer
                  , OfficeName VARCHAR(10))

CREATE TABLE Employee(EmployeeID integer
                    , EmployeeName VARCHAR(10)
                    , OfficeID integer
                    , WorkingHoursID integer
                    , UseOfficeDefaultWorkingHours Boolean)

CREATE TABLE WorkingHours(ID integer
                        , StartTime TIME
                        , EndTime TIME
                        , OfficeID integer
                        , OfficeDefaultWorkingHours Boolean)

此外,不要忘记在每个 table 中的唯一列上实施约束和主键。

Employee table 中添加一列以指定员工是否在默认办公时间工作 (UseOfficeDefaultWorkingHours)。

WorkingHours table 中添加一列以指定该行是否在另一个布尔列的帮助下包含办公室的默认工作时间,在本例中为 OfficeDefaultWorkingHours .

您可以查询此架构以获取员工的工作时间,其查询类似于以下查询:

SELECT
    E.EmployeeName
    , W.StartTime
    , W.EndTime
FROM Employee E
    INNER JOIN WorkingHours W ON E.OfficeID = WorkingHours.OfficeID
        AND E.UseOfficeDefaultWorkingHours = W.OfficeDefaultWorkingHours
        AND W.ID = CASE 
                        WHEN E.WorkingHoursID IS NOT NULL
                            THEN E.WorkingHoursID
                        ELSE W.ID
                    END
WHERE E.EmployeeID = 1

此查询可以在 SQL 服务器 RDBMS 下运行,但我不确定它是否可以在其他 RDBMS 产品上运行,您可能需要相应地进行调整。