有人可以帮助我为一个时间表应用程序提供粗略的数据库架构,我可以
为不同的项目每天存放一段时间(2周)。 Ex person A可以在同一天为projectA投放3个小时,为projectB投放4个小时
这样做可以很容易地获得有关项目总工作时间的报告,或者获得某个人在所有项目上的总工作时间
编辑:另一项要求是,每个人在特定时间段内的每个时间表都需要有一个字段,表明该人已提交了时间表,另一个时间表说已经批准
答案 0 :(得分:10)
借用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
提交时间表时会创建“审批”行。这些字段可以是TimeSheet表的一部分。我使用四阶规范化将其分解,因为Approval表可能具有与TimeSheet表不同的数据库访问权限。
PayrollCycle
- PayrollCycleID (PK)
- PayrollCycleYear
- PayrollCycleNumber
- StartDate
- EndDate
- DirectDepositDate
- CheckDate
- Other_fields
PayrollCycle表规范化了一些日期字段,并提供了一个整数键,可以更容易地将WorkSegment和TimeSheetSegment行组合在一起,以形成一致的时间表。
答案 1 :(得分:2)
这是一个粗略的草图,将为您提供一个良好的开端:
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
--------
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
答案 2 :(得分:0)
人员表(1)
项目表(2)
预订表(3) - 谁完成了工作(FK为1),他们做了什么项目(FK为2),他们什么时候开展工作,他们做了多少工作。
从(3)中选择sum(time_booked),其中person等于(某些id为1)和project =(某些ID为2)
或
从(3)中选择sum(time_booked),其中person等于(某些id为1)
等...
答案 3 :(得分:0)
听起来有点像家庭作业,但我可能会从这样的事情开始:
People
- PersonID (PK)
- PersonName
- Other fields
Projects
- ProjectID (PK)
- ProjectName
- Other fields
WorkTime
- TimeID (PK)
- ProjectID (FK)
- PersonID (FK)
- StartTime
- EndTime
答案 4 :(得分:0)
以下代码取自PostgreSQL语法中的]project-open[开源系统并进行了编辑。
请注意带有批准/确认信息的“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创建脚本中。