sql - 数据库模式

标签 sql database database-schema

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

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

最佳答案

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

相关文章:

mysql - 改为检索 SQL 对象或行

mysql - 如何在不对表进行任何更改的情况下更改表的引擎

process - 您在开发团队中处理数据库架构更改的过程是什么?

mysql - 类似Twitter的数据库表结构

java - 使用 Java 持久性查询语言在表中插入和更新数据

mysql - 如何知道SQL中记录的插入日期

sql - 如何找到始终包含确切数量的字符类型的子字符串?

php - mySQL:将值插入到具有外键关系的2个表中

mysql - 为什么 mySQL 不在我的测试查询中使用我的索引?

mysql - 如何查询 1 个包含 6 列的表,其中 3 列有条件