Mitarbeiter einplanen - Welche Datenstruktur soll verwendet werden?

9

Frage

Ich versuche eine einfache Mitarbeiter-Planungssoftware für etwa 10-20 Leute in meiner Softwareentwicklungsfirma zu schreiben. Nach einiger Überlegung habe ich mich entschlossen, eine Web-App in Python, Ruby oder PHP + Postgres / MySQL DB zu schreiben. Beim Entwurf von Datenbankmodellen begann ich mich zu fragen, welche Datenstruktur für diese Art von Anwendung am besten geeignet wäre.

Wie es aussehen wird

Ein Beispiel für eine App, die die Monatsansicht zeigt, wäre ähnlich:

%Vor%

wo M - & gt; für Morgenschicht; A - & gt; Nachmittagsschicht usw. (Buchstaben können in Codes geändert werden)

Welche Datenstruktur oder welches Datenbankdesign wäre dafür am besten? Ich habe darüber nachgedacht, Strings zu speichern (max. 31 Zeichen - & gt; 1 Zeichen, 1 Tag), ähnlich wie - & gt; "MMAANNOOOAAMMNNAAOO ..." für jeden Benutzer; Die Monatstabelle würde solche Zeichenfolgen für jeden Mitarbeiter enthalten.

Was würden Sie vorschlagen?

    
M_1 27.10.2009, 23:19
quelle

3 Antworten

10

Ich würde mit einem Kimball-Stern mit drei Tischen gehen (Datum, Mitarbeiter, Zeitplan), weil Sie früher oder später aufgefordert werden, Berichte daraus zu erstellen. Wer hat die meisten Nächte gearbeitet? Wer hat an den meisten Wochenenden gearbeitet? Wer arbeitet nie am Wochenende? Warum bin ich immer am Freitag Nachmittag geplant? An welchem ​​Tag einer Woche sind bestimmte Mitarbeiter höchstwahrscheinlich nicht dabei? Usw., usw. ...

Tabellen wären:

TABLE dimDate (KeyDate, FullDate, DayOfWeek, DayNumberInWeek, IsHoliday,... more here)
Sie können die dimDate-Tabelle zum Beispiel für 10 Jahre vorfüllen. Möglicherweise müssen Sie von Zeit zu Zeit die Spalte "IsHoliday" anpassen.

Employee Tabelle ändert sich auch (relativ) selten.
TABLE dimEmployee (KeyEmployee, FirstName, LastName, Age, ... more here)

Schedule Tabelle ist, wo Sie den Arbeitsplan ausfüllen würden, ich habe auch "HoursOfWork" für jede Schicht vorgeschlagen, auf diese Weise ist es einfach, Stunden in Berichten zu sammeln, wie: "Wie viele Stunden hat John Doe letztes Jahr gearbeitet an Feiertagen? "

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 Ersatzschlüssels können Sie auch KeyDate, KeyEmployee und Shift zu einem zusammengesetzten Primärschlüssel kombinieren, um sicherzustellen, dass Sie dieselbe Person nicht am selben Tag in derselben Schicht einplanen können. Überprüfen Sie dies auf der Anwendungsebene, wenn der Ersatzschlüssel verwendet wird.
Fügen Sie Tabellen bei der Abfrage wie folgt hinzu:

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 Speichermodul zu verwenden und Ihre Fremdschlüssel (FK) als "nur logisch" zu implementieren - verwenden Sie die Anwendungsschicht, um auf referenzielle Integrität zu achten.

Hoffe, das hilft.

    
Damir Sudarevic 28.10.2009, 13:55
quelle
2

Eine schnelle Antwort zuerst:

  • Mitarbeiter-ID
  • Datum
  • ShiftType

Das heißt, das beste Datenbankdesign hängt weitgehend davon ab, was Sie mit den Daten machen werden. Wenn all erforderlich ist, speichern Sie die Datensätze und zeigen sie in einer ähnlichen Tabelle an. Beispiel: Ihr Ansatz funktioniert (obwohl nicht elegant).

Wenn Sie jedoch die Daten abrufen oder Berichte ausführen möchten, benötigen Sie etwas Strukturierteres als eine Zeichenfolge, bei der jedes Zeichen den Typ der Schichtbelegung darstellt.

    
Larsenal 27.10.2009 23:23
quelle
1

Ich würde eine eher anonymisierte Datenbank vorschlagen, z.B. eine Tabelle für Personen und eine, die das Produkt von Shift-Informationen für ein perdon und ein Datum ist.

    
Lucero 27.10.2009 23:25
quelle