有人可以帮助我为时间表应用程序提供一个粗略的数据库架构,我可以在其中
不同项目在一段时间(2 周)内每天存储小时数。前任 A 可以在同一天为项目 A 投入 3 小时,为项目 B 投入 4 小时
使其易于获得有关项目总小时数的报告,或获得某个人在所有项目上的总小时数
编辑:另一个要求是,每个人的特定时间段的每个时间表都需要有一个字段表明该人已提交时间表,另一个说明它已被批准
有人可以帮助我为时间表应用程序提供一个粗略的数据库架构,我可以在其中
不同项目在一段时间(2 周)内每天存储小时数。前任 A 可以在同一天为项目 A 投入 3 小时,为项目 B 投入 4 小时
使其易于获得有关项目总小时数的报告,或获得某个人在所有项目上的总小时数
编辑:另一个要求是,每个人的特定时间段的每个时间表都需要有一个字段表明该人已提交时间表,另一个说明它已被批准
借用 Eric Petroelje & mdma:
Employee
- EmployeeID (PK)
- EmployeeName
- Other_fields
Project
- ProjectID (PK)
- ProjectName
- Other_fields
WorkSegment
- WorkSegmentID (PK)
- ProjectID (IX1)
- EmployeeID (IX2)
- Date (IX1, IX2)
- StartTime
- EndTime
- PayrollCycleID (FK)
WorkSegment 的第一个索引是 ProjectID,Date。WorkSegment 的第二个索引是 EmployeeID,Date。这些索引不是唯一的。这样一个人一天就可以在一个项目上工作不止一次。这些索引允许按项目或按人报告工作时间。
每个 WorkSegment 行代表一个时间段、一天、一个项目。每个员工都有尽可能多的 WorkSegment 行来描述他的工资周期。
TimeSheetSegment
- TimeSheetSegmentID (PK)
- ProjectId (FK)
- EmployeeId (FK)
- PayrollCycleID (FK)
ProjectID、EmployeeID 和 PayrollCycleID 有一个唯一索引。员工在工资核算周期中工作的每个项目都有一个 TimeSheetSegment 行。
TimeSheet
- TimeSheetID (PK)
- EmployeeID (IX)
- PayrollCycleID (IX)
TimeSheet 行将 TimeSheetSegment 和 WorkSegment 行结合在一起。EmployeeID、PayrollCycleID 索引是唯一的。
Approval
- TimeSheetID (PK)
- PayrollCycleID (FK)
- SubmittedTimestamp
- ApproverID (FK)
- ApprovedTimestamp
Approval 行是在提交时间表时创建的。这些字段可能是 TimeSheet 表的一部分。我用四阶规范化将它们分开,因为 Approval 表可能具有与 TimeSheet 表不同的数据库访问权限。
PayrollCycle
- PayrollCycleID (PK)
- PayrollCycleYear
- PayrollCycleNumber
- StartDate
- EndDate
- DirectDepositDate
- CheckDate
- Other_fields
PayrollCycle 表对一些日期字段进行了规范化,并提供了一个整数键,可以更轻松地将 WorkSegment 和 TimeSheetSegment 行组合在一起以制作一个连贯的时间表。
这是一个粗略的草图,可以为您提供一个良好的开端:
Project
-------
ProjectId PK
ProjectName varchar(200)
Employee
---------
EmployeeId PK
EmployeeName (or first name/last name etc..)
// .. other employee attributes
ProjectTimesheet
----------------
ProjectTimesheetId PK
ProjectId FK -> Project.ProjectId
EmployeeId FK -> Employee.EmployeeId
StartTime DATETIME
EndTime DATETIME
Approved bit
编辑:作为每个 ProjectTimesheet 行中已批准标志的替代方案,您可以将已批准状态分开到单独的表中。例如,要允许在给定时间段内批准员工的时间表,经理将在 Approval 表中添加一个批准条目:
Approval
--------
ApprovalID PK
EmployeeId FK -> Employee.EmployeeId
StartTime DATETIME
EndTime DATETIME
ApprovedBy FK -> Employee.EmployeeId (e.g. the manager)
ApprovedDate timestamp // date the approval was registered
听起来有点像家庭作业,但我可能会从这样的事情开始:
People
- PersonID (PK)
- PersonName
- Other fields
Projects
- ProjectID (PK)
- ProjectName
- Other fields
WorkTime
- TimeID (PK)
- ProjectID (FK)
- PersonID (FK)
- StartTime
- EndTime
人桌(1)
项目表(2)
预订表(3) - 谁做了工作(FK 到 1),他们在做什么项目(FK 到 2),他们什么时候做的,他们做了多少工作。
从 (3) 中选择 sum(time_booked),其中 person 等于(来自 1 的一些 id)和 project =(来自 2 的一些 ID)
或者
从 (3) 中选择 sum(time_booked),其中人等于(来自 1 的一些 id)
ETC...
以下代码取自]project-open[开源系统,采用 PostgreSQL 语法并经过编辑。
请注意带有批准/确认信息的“conf_objects”表。当用户“提交”一个时间表时,所有提交的时间都分配给一个新的 conf_object。将 conf_object 的状态设置为“已批准”是主管的工作。主管或用户都可以随时删除 conf_object,这将再次将小时标记为“未提交”(hour.conf_object_id = NULL),因此这些小时将最终出现在“未提交的小时”报告中。
CREATE TABLE projects (
project_id integer constraint projects_pk primary key,
project_name text not null,
parent_id integer constraint projects_parent_fk references projects,
[...]
project_type_id integer not null constraint projects_prj_type_fk references categories,
project_status_id integer not null constraint projects_prj_status_fk references categories,
description text,
start_date timestamptz,
end_date timestamptz
);
CREATE TABLE users (
user_id integer constraint users_pk primary key,
first_names text,
last_name text
[...]
);
-- Confirmation (=approval) objects
CREATE TABLE conf_objects (
conf_id integer constraint conf_id_pk primary key,
conf_status_id integer constraint conf_status_nn not null
);
CREATE TABLE hours (
user_id integer constraint hours_user_id_nn not null constraint hours_user_id_fk references users,
project_id integer constraint hours_project_id_nn not null constraint hours_project_id_fk references projects,
day date constraint hours_day_nn not null,
hours numeric(5,2) not null,
[...]
note text,
conf_object_id integer constraint hours_conf_object_fk references conf_objects
);
原始的 ]po[ SQL 语句包含在 ~/packages/intranet-*/sql/postgresql/intranet-*-create.sql 创建脚本中。