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

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

最佳答案

您可以做的是创建一个类似于下面的架构。当然,您需要添加额外的列来保存额外的数据(如果有),并且还需要使用特定于您正在使用的 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)

另外,不要忘记在每个表中的唯一列上实现约束和主键。

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

WorkingHours 表中,您可以在另一个 bool 列(在本例中为 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 Server RDBMS 下工作,但我不确定它是否适用于其他 RDBMS 产品,您可能需要相应地进行调整。

关于sql - 数据库模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31046006/

10-11 03:32
查看更多