Как нормализовать данные Табеля учета рабочего времени?
-
16-10-2019 - |
Вопрос
Мне ужасно трудно найти подходящий способ хранения этих данных в базе данных.
Текущая версия Excel (простая) выглядит примерно так:
http://i.stack.imgur.com/BEZOw.png
У персонала и Клиента также есть дополнительные данные, связанные с ними, поэтому имеет смысл использовать там связь с внешним ключом.Однако я не уверен, как хранить данные о часах.Очевидно, что вы могли бы создать столбец для каждого периода времени, однако это кажется очень раздутым подходом.
Затем я подумал, что каждая "ячейка", содержащая данные о часах, может быть представлена следующим образом:
http://i.stack.imgur.com/4VTXQ.png
Однако, похоже, что значения ключей персонала и клиента сохраняются слишком много раз.Я никогда раньше не создавал надлежащую базу данных и был бы очень признателен за предложения.
* Извините, что не размещаю прямые ссылки на изображения, у меня недостаточно репутации на этом подсайте
Решение
Вы хотите иметь что-то вроде этого:
Это позволяет вам иметь любое количество периодов работы для каждого сотрудника и клиента и предоставляет вам подробную информацию о том, кто на кого работал и как долго (не говоря уже о том, когда - что также очень важно!).
Другие советы
Я бы использовал для этого минимум две таблицы.Идентификатор пользователя будет ссылкой на ваши пользовательские таблицы.
CREATE TABLE TimeSheet(
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NOT NULL)
CREATE TABLE TimeSheet_Detail(
[ID] [int] IDENTITY(1,1) NOT NULL,
[TimeSheetID] [int] NOT NULL,
[Hours] [float] NOT NULL)
Что - то вроде этого:
Employees { Staff } KEY { Staff } ;
Clients { Client } KEY { Client } ;
StaffAssignments { Client , Staff }
KEY { Client , Staff }
FOREIGN KEY { Client } REFERENCES Clients ,
FOREIGN KEY { Staff } REFERENCES Employees ;
Timesheets { Client , Staff , Sequence , TimeGranule }
KEY { Client , Staff , Sequence }
FOREIGN KEY { Client , Staff } REFERENCES StaffAssignments ,
CONSTRAINT Sequence >= 1 AND Sequence <= 55 ,
CONSTRAINT TimeGranule > 0 ;