Заимствование у Эрика Петроэле & 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 для создания согласованного расписания.