Планирование работы сотрудников - какую структуру данных использовать?

StackOverflow https://stackoverflow.com/questions/1634248

Вопрос

Вопрос

Я пытаюсь написать простое программное обеспечение для планирования работы сотрудников примерно для 10-20 человек в моей компании-разработчике программного обеспечения.После некоторых размышлений я остановился на написании веб-приложения на Python, Ruby или PHP + Postgres / MySQL DB.При разработке моделей баз данных я начал задаваться вопросом, какая структура данных на самом деле была бы наилучшей для такого рода приложений.

Как это будет выглядеть

Пример приложения, показывающего представление за месяц, был бы похож на этот:

 OCTOBER    1 2 3 4 5 6 7 8 9 ...
John Apple  M M A A N N O O O ...
Daisy Pear  O O O M M A A N N ...
Steve Cat   A A N N O O O M M ...
Maria Dog   N N O O O M M A A ...

где M -> для утренней смены;A -> Дневная смена и т.д.(буквы могут быть заменены на коды)

Какая структура данных или дизайн базы данных были бы наилучшими для этого?Я думал о хранении строк (максимум 31 символ -> 1 символ, 1 день), похожих на -> "MMAANNOOAAMMNNAAOO ..." для каждого пользователя;Таблица месяцев будет содержать такие строки для каждого сотрудника.

Что бы вы предложили?

Это было полезно?

Решение

Я бы выбрал звезду Кимбалла с тремя столами (Дата, Сотрудник, Расписание), потому что рано или поздно вас попросят создать (требующие) отчеты из этого. Кто работал большинство ночей? Кто работал большинство выходных? Кто никогда не работает по выходным? Почему я всегда намечен на пятницу? В какой день недели некоторые сотрудники, скорее всего, не будут появляться? И т. Д., И т. Д ...

Таблицы будут:

TABLE dimDate (KeyDate, FullDate, DayOfWeek, DayNumberInWeek, IsHoliday, ... подробнее здесь)
Вы можете предварительно заполнить таблицу dimDate на 10 лет или около того - возможно, потребуется настроить «IsHoliday». столбец время от времени.

Таблица сотрудников также изменяется (относительно) редко.
TABLE dimEmployee (KeyEmployee, FirstName, LastName, Age, ... подробнее здесь)

Таблица расписаний - это место, где вы должны заполнить график работы. Я также предложил " HoursOfWork " для каждой смены легко агрегировать часы в отчетах, например: "Сколько часов Джон Доу работал в прошлом году в праздничные дни?"

TABLE factSchedule (
KeySchedule, - суррогатный ПК
KeyDate, - FK для таблицы dimDate
KeyEmployee, - FK для таблицы dimEmployee
Shift, - число сдвига (вырожденное измерение)
HoursOfWork, - количество рабочих часов в эту смену
)

Вместо суррогатного KeySchedule вы также можете объединить KeyDate, KeyEmployee и Shift в составной первичный ключ, чтобы убедиться, что вы не можете назначить одного человека на одну и ту же смену в тот же день. Отметьте это на прикладном уровне, если используется суррогатный ключ.
При запросе объединяйте таблицы, например:

<код> ВЫБЕРИТЕ СУММУ (s.HoursOfWork)
ОТ фактов  
ПРИСОЕДИНЯЙТЕСЬ к dimDate КАК d ON ON s.KeyDate = d.KeyDate  
ПРИСОЕДИНИТЕСЬ к dimEmployee КАК e ON s.KeyEmployee = e.KeyEmployee
ГДЕ  
e.FirstName = 'John' AND e.LastName = 'Doe'
AND d.Year = 2009 AND d.IsHoliday = 'Yes';

Если вы используете MySQL, все в порядке, если вы используете MyISAM для механизма хранения и реализуете свои внешние ключи (FK) как " только логические " - используйте прикладной уровень, чтобы заботиться о ссылочной целостности.

Надеюсь, это поможет.

 empschd_model_01

Другие советы

Сначала быстрый ответ:

  • Идентификатор сотрудника
  • Дата
  • Тип сдвига

Тем не менее, наилучший дизайн базы данных во многом зависит от того, что вы собираетесь делать с данными.Если ВСЕ вам нужно всего лишь сохранить записи и отобразить их в таблице, подобной вашему примеру, тогда ваш подход (хотя и не элегантный) сработал бы.

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

Я бы предложил более норализованную базу данных, например, таблица для людей и одна, которая является продуктом сменной информации для пердона и даты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top