15 Stimmen

Terminplanung Mitarbeiter - welche Datenstruktur ist zu verwenden?

Frage

Ich versuche, eine einfache Software für die Personaleinsatzplanung für etwa 10-20 Personen in meiner Softwareentwicklungsfirma zu schreiben. Nach einigen Überlegungen entschied ich mich für eine Web-App in Python, Ruby oder PHP + Postgres/MySQL DB. Während ich die Datenbankmodelle entwarf, begann ich mich zu fragen, welche Datenstruktur für diese Art von Anwendung eigentlich am besten geeignet wäre.

Wie sie aussehen wird

Ein Beispiel für eine Anwendung, die die Monatsansicht anzeigt, sieht so aus:

 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 ...

wobei M -> für Morgenschicht; A -> Nachmittagsschicht usw. (Buchstaben können in Codes umgewandelt werden)

Welche Datenstruktur oder welcher Datenbankentwurf wäre dafür am besten geeignet? Ich dachte an die Speicherung von Zeichenfolgen (max. 31 Zeichen -> 1 Zeichen, 1 Tag) ähnlich wie -> "MMAANNOOOAAMMNNAAOO..." für jeden Benutzer; die Monatstabelle würde solche Zeichenfolgen für jeden Mitarbeiter enthalten.

Was würden Sie vorschlagen?

18voto

Damir Sudarevic Punkte 21527

Ich würde mich für den dreiteiligen Kimball-Stern ( Date, Employee, Schedule ), denn früher oder später werden Sie aufgefordert werden, daraus (anspruchsvolle) Berichte zu erstellen. Wer hat am meisten nachts gearbeitet? Wer hat die meisten Wochenenden gearbeitet? Wer arbeitet nie an Wochenenden? Warum bin ich immer am Freitagnachmittag eingeplant? An welchem Wochentag ist die Wahrscheinlichkeit am größten, dass bestimmte Mitarbeiter nicht auftauchen? Und so weiter, und so fort...

Die Tabellen wären:

TABLE dimDate (
    KeyDate
  , FullDate
  , DayOfWeek
  , DayNumberInWeek
  , IsHoliday
  ,... more here
)

Sie können die Tabelle "dimDate" für etwa 10 Jahre vorausbefüllen - möglicherweise müssen Sie die Spalte "IsHoliday" von Zeit zu Zeit anpassen.

Auch die Tabelle der Mitarbeiter ändert sich (relativ) selten.

TABLE dimEmployee (
    KeyEmployee
  , FirstName
  , LastName
  , Age
  , ... more here
)

In die Tabelle "Zeitplan" tragen Sie den Arbeitsplan ein. Ich habe auch "Arbeitsstunden" für jede Schicht vorgeschlagen, so dass sich die Stunden in Berichten leicht zusammenfassen lassen, z. B.: "Wie viele Stunden hat John Doe letztes Jahr an Feiertagen gearbeitet?"

TABLE
factSchedule (
    KeySchedule  -- surrogate PK
  , KeyDate      -- FK to dimDate table
  , KeyEmployee  -- FK to dimEmployee table
  , Shift        -- shift number (degenerate dimension)
  , HoursOfWork  -- number of work hours in that shift
)

Anstelle des Surrogatschlüssels KeySchedule könnten Sie auch KeyDate, KeyEmployee und Shift zu einem zusammengesetzten Primärschlüssel kombinieren, um sicherzustellen, dass Sie nicht dieselbe Person für dieselbe Schicht am selben Tag einplanen können. Überprüfen Sie dies in der Anwendungsschicht, wenn der Ersatzschlüssel verwendet wird. Verbinden Sie bei der Abfrage Tabellen wie:

SELECT SUM(s.HoursOfWork)
 FROM factSchedule AS s
 JOIN dimDate      AS d ON s.KeyDate = d.KeyDate
 JOIN dimEmployee  AS e ON s.KeyEmployee = e.KeyEmployee
WHERE e.FirstName='John'
  AND e.LastName='Doe'
  AND d.Year = 2009
  AND d.IsHoliday ='Yes';

Wenn Sie MySQL verwenden, ist es in Ordnung, MyISAM als Speicher-Engine zu verwenden und Ihre Fremdschlüssel (FK) als "nur logisch" zu implementieren - verwenden Sie die Anwendungsschicht, um die referenzielle Integrität zu gewährleisten.

Ich hoffe, das hilft.


empschd_model_01

3voto

Larsenal Punkte 47282

Zunächst eine kurze Antwort:

  • MitarbeiterID
  • Datum
  • ShiftType

Das beste Datenbankdesign hängt jedoch weitgehend davon ab, was Sie mit den Daten machen wollen. Wenn tous Wenn Sie die Datensätze speichern und in einer Tabelle ähnlich wie in Ihrem Beispiel anzeigen möchten, würde Ihr Ansatz (wenn auch nicht elegant) funktionieren.

Wenn Sie jedoch die Daten abrufen oder Berichte erstellen wollen, benötigen Sie etwas Strukturierteres als eine Zeichenkette, bei der jedes Zeichen für die Art der Schichtzuweisung steht.

1voto

Lucero Punkte 57715

Ich würde eine stärker normierte Datenbank vorschlagen, z.B. eine Tabelle für Personen und eine, die das Produkt aus Schichtinformationen für eine Person und ein Datum ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X