时间表的数据库模式

时间:2010-07-19 15:21:38

标签: database-design schema database-schema

有人可以帮助我为一个时间表应用程序提供粗略的数据库架构,我可以

  1. 为不同的项目每天存放一段时间(2周)。 Ex person A可以在同一天为projectA投放3个小时,为projectB投放4个小时

  2. 这样做可以很容易地获得有关项目总工作时间的报告,或者获得某个人在所有项目上的总工作时间

  3. 编辑:另一项要求是,每个人在特定时间段内的每个时间表都需要有一个字段,表明该人已提交了时间表,另一个时间表说已经批准

5 个答案:

答案 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创建脚本中。