【问题标题】:Database schema数据库架构
【发布时间】:2015-06-25 09:12:00
【问题描述】:

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

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

【问题讨论】:

    标签: sql database database-schema


    【解决方案1】:

    您可以做的是创建一个类似于下面的架构。当然,您需要添加额外的列来保存额外的数据(如果有的话),并使用特定于您正在使用的 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 表中添加一列以指定该行是否包含办公室的默认工作时间,并借助另一个布尔列,在本例中为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 产品,您可能需要进行相应调整。

    【讨论】:

      【解决方案2】:

      你可以做一件事是创建一个独立于员工的新表 WorkingHours

      Working hours 
      
      Id  Working Hours
      1     10 - 8
      2     12- 9
      

      为员工表分配 id 值

      Employee
      
      ID WorkingHoursID
      1     2
      2     2
      3     1
      

      【讨论】:

      • Office 默认工作时间怎么样。在许多情况下,办公室的员工将拥有办公室的默认工作时间。这样,我最终将为每个员工提供工作时间行
      • @den 查看我的答案。您添加一列(布尔值就足够了)来指定员工是否使用办公室的默认工作时间。否则,使用适当的 ID 填充 WorkingHoursID
      【解决方案3】:

      WorkingHours 将是一个不同的实体。

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

      【讨论】:

        【解决方案4】:

        创建三个表
        1. 办公室:这里应该是办公地点、名称和自己的ID
        2. 时序表:ID、OfficeID、TimeSLot
        3. 员工:在此表中创建一个列 OfficeID 并从他或她正在工作的办公室表中创建一个办公室 ID,并使用 TimeslotID 和第二个表的传递 ID 的其他列。

        喜欢:EmpID、OfficeID、TimeSLotID

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-17
          • 2010-12-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多