【发布时间】:2015-06-25 09:12:00
【问题描述】:
我有 2 个实体 Office 和 Employee,我想为 WorkingHours 设计数据库架构。有些办公室为其员工设置了默认的 WorkingHours,但有些员工可能有不同的 WorkingHours。
建模的最佳方法是什么?我在两个表中都有工作时间吗?
【问题讨论】:
标签: sql database database-schema
我有 2 个实体 Office 和 Employee,我想为 WorkingHours 设计数据库架构。有些办公室为其员工设置了默认的 WorkingHours,但有些员工可能有不同的 WorkingHours。
建模的最佳方法是什么?我在两个表中都有工作时间吗?
【问题讨论】:
标签: sql database database-schema
您可以做的是创建一个类似于下面的架构。当然,您需要添加额外的列来保存额外的数据(如果有的话),并使用特定于您正在使用的 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 产品,您可能需要进行相应调整。
【讨论】:
你可以做一件事是创建一个独立于员工的新表 WorkingHours
Working hours
Id Working Hours
1 10 - 8
2 12- 9
为员工表分配 id 值
Employee
ID WorkingHoursID
1 2
2 2
3 1
【讨论】:
WorkingHoursID。
WorkingHours 将是一个不同的实体。
办公室有一个默认工作时间(或者可能不止一个?)。 一名员工有一个工作小时。员工的工作时间数据取自员工办公室的工作时间。员工的工作时间可以在不改变办公室工作时间的情况下改变。
【讨论】:
创建三个表
1. 办公室:这里应该是办公地点、名称和自己的ID
2. 时序表:ID、OfficeID、TimeSLot
3. 员工:在此表中创建一个列 OfficeID 并从他或她正在工作的办公室表中创建一个办公室 ID,并使用 TimeslotID 和第二个表的传递 ID 的其他列。
喜欢:EmpID、OfficeID、TimeSLotID
【讨论】: