схема базы данных для расписания - PullRequest
7 голосов
/ 19 июля 2010

Может ли кто-нибудь помочь мне с приблизительной схемой базы данных для приложения расписания, где я смогу

  1. Хранение часов в день в течение периода времени (2 недели) для различных проектов. Бывший человек А может поставить 3 часа для проекта А и 4 часа для проекта В в тот же день

  2. Сделайте так, чтобы можно было легко получать отчеты об общих часах, отведенных для проекта, или получать общее количество часов по всем проектам определенного человека

РЕДАКТИРОВАТЬ: Другое требование может заключаться в том, что в каждом расписании на определенный период времени для каждого человека должно быть поле, указывающее, что этот человек отправил расписание, а другое - о том, что оно было утверждено

Ответы [ 5 ]

10 голосов
/ 19 июля 2010

Заимствование у Эрика Петроэле & 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. Я разбил их с помощью нормализации четвертого порядка, потому что таблица утверждения, скорее всего, будет иметь другие права доступа к базе данных, чем таблица расписания.

PayrollCycle
- PayrollCycleID (PK)
- PayrollCycleYear
- PayrollCycleNumber
- StartDate 
- EndDate
- DirectDepositDate
- CheckDate
- Other_fields

Таблица PayrollCycle нормализует некоторые поля даты и предоставляет целочисленный ключ, который облегчает объединение строк WorkSegment и TimeSheetSegment для создания согласованного расписания.

2 голосов
/ 19 июля 2010

Вот примерный набросок, который даст вам хорошее начало:

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
0 голосов
/ 01 июня 2013

Следующий код взят из открытой системы проекта ] [ с синтаксисом 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.

0 голосов
/ 19 июля 2010

Звучит как домашнее задание, но я бы, наверное, начал что-то вроде этого:

People 
  - PersonID (PK)
  - PersonName
  - Other fields

Projects
  - ProjectID (PK)
  - ProjectName
  - Other fields

WorkTime
  - TimeID (PK)
  - ProjectID (FK)
  - PersonID (FK)
  - StartTime
  - EndTime
0 голосов
/ 19 июля 2010

Стол для людей (1)

Стол для проектов (2)

Таблица для заказов (3) - кто выполнял работу (FK в 1), над каким проектом они работали (FK в 2), когда они выполняли работу, сколько работы они выполняли.

Выберите сумму (time_booked) из (3), где человек равен (некоторый идентификатор из 1) и проект = (некоторый идентификатор из 2)

или

Выберите сумму (time_booked) из (3), где человек равен (некоторый идентификатор из 1)

и т.д ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...