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.
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?
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.
Eine schnelle Antwort zuerst:
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.
Tags und Links data-structures database-design scheduling