Anfänger: Datenstruktur für Projekt "Mitarbeiterauswertung"

thobr

Benutzer
Beiträge
7
Hallo!

Ich bin neu hier und habe gleich mal eine Anfängerfrage.

Ich versuche gerade folgendes Projekt zu verwirklichen:

In einem gemeinnützigen Verein haben wir jede Woche einen Dienst. Im Dienst sind im mindestens 31 Personen – maximal 60.

Ich lese die Daten jeden Diensts via Python ein.

Es gibt verschiedene Einheiten:

- KDO (1 Mitarbeiter pro Dienst)
- RLS (2 Einheiten mit je 1 Mitarbeiter pro Dienst)
- JUM (2 Einheiten mit je 4 Mitarbeiter pro Dienst)
- RTW (10-16 Einheiten mit je 2-3 Mitarbeiter pro Dienst)

Jede einzelne Einheit hat noch folgende Werte:

- Einheitennummer (alle außer RLS)

- Startzeit

- Endzeit

- Stützpunkt

- Zimmer


Jetzt sollen mit diesen Werten verschiedene Auswertungen erfolgen. Zum Beispiel der Anteil einzelner Mintarbeiter auf einem bestimmten Stützpunkt. Oder wie oft jemand einen bestimmten Start oder Endzeit hat etc. Auch wer wie oft mit gewissen Personen fährt. Wer wie oft auf welcher Einheit war etc.

Welche Datenbank benutzt wird ist noch nicht ganz klar. Vermutlich MySQL oder PostgreSQL. (falls dies einen Unterschied macht von den Tabellen her)

Jetzt stellt sich mir die Frage wie ich die Tabellen anlege.

Ich habe leider keinen Ansatz auf wie viele Tabellen ich es aufteilen soll.

1 Tabelle mit PersonalNr. und Name. Damit ich bei den anderen Tabellen nur immer die PersonalNr. eintragen muss.
Weiters würde ich auch gerne die Vorhanden Ausbildungen (Funktionen) bei den Mitarbeitern speichern. (es gibt folgende Funktionen: A, B, C, D, E, F, G, H)

Bitte um Hilfe :)

LG
 
Werbung:
auf dem ersten Blick erst einmal schwer zu sagen, wie viele Tabellen man hier braucht - dafür ist das alles zu unklar. Aber einige Dinge:

  • trenne fixe Daten von Bewegungsdaten. Das hast Du schon erkannt, mit der Tabelle für das Personal. Vermutlich solltest Du ähnlich bei den Einheiten (KDO, RLS, JUM, RTW) vorgehen, damit dort vielleicht spätere dazu kommen können. Das gilt auch für die Ausbildungen. Diese ordnest dann in einer weiteren Tabelle den Mitarbeitern zu.
  • verwende von Anfang an korrekte Datentypen, Constraints und Foreign Keys. Datentypen für Zeitbereiche gibt es auch, DATERANGE, TSRANGE in PostgreSQL. Das vereinfacht später Abfragen wie 'wer war alles von-bis bei Einsatz' oder so. Auch kannst Du so z.B. in der DB schon sicherstellen, daß Ressourcen (wie z.B. Mitarbeiter) nicht überbucht werden.
  • damit einher geht auch ganz klar meine Empfehlung für die Datenbank ;-)
 
auf dem ersten Blick erst einmal schwer zu sagen, wie viele Tabellen man hier braucht - dafür ist das alles zu unklar. Aber einige Dinge:

  • trenne fixe Daten von Bewegungsdaten. Das hast Du schon erkannt, mit der Tabelle für das Personal. Vermutlich solltest Du ähnlich bei den Einheiten (KDO, RLS, JUM, RTW) vorgehen, damit dort vielleicht spätere dazu kommen können. Das gilt auch für die Ausbildungen. Diese ordnest dann in einer weiteren Tabelle den Mitarbeitern zu.
  • verwende von Anfang an korrekte Datentypen, Constraints und Foreign Keys. Datentypen für Zeitbereiche gibt es auch, DATERANGE, TSRANGE in PostgreSQL. Das vereinfacht später Abfragen wie 'wer war alles von-bis bei Einsatz' oder so. Auch kannst Du so z.B. in der DB schon sicherstellen, daß Ressourcen (wie z.B. Mitarbeiter) nicht überbucht werden.
  • damit einher geht auch ganz klar meine Empfehlung für die Datenbank ;-)

Danke für die rasche Antwort.
Eine kurze Grundlegende Frage:

Wenn ich jetzt zum beispiel die folgenden Tabellen habe:

TABLE "Mitarbeiter"
PersNr. | Name | Geschlecht

und

TABLE "Funktionen"

ID | Funktion | Beschreibung

und

TABLE "Einheiten"

ID | Einheitenname | benötigteFunktion


Trage ich dann in die Spalte "benötigteFunktion" die ID von TABLE "Funktionen" ein?
Wenn ich jetzt speichern möchte, wann ein gewisser Mitarbeiter mit welcher Funktion auf welcher Einheit war erstelle ich dann eine Table mit:

ID | Datum | Mitarbeiter | Funktion | Einheit

und Trage hier nur die Primary Keys (PersNr, ID, ID) ein?

LG
 
Werbung:
Ja. Kurzes Demo:

Code:
test=# create table mitarbeiter(pers_nr int primary key, name text);
CREATE TABLE
test=*# create table funktionen (id int primary key, funktion text);
CREATE TABLE
test=*# create table einheit (id int primary key, name text);
CREATE TABLE
test=*# create table mitarbeiter_funktion_einheit (id int primary key, von_bis daterange, mitarbeiter int references mitarbeiter, funktion int references funktionen, einheit int references einheit, exclude using gist(mitarbeiter with =, von_bis with &&));
CREATE TABLE
test=*# insert into mitarbeiter values (1, 'Mitarbeiter 1');
INSERT 0 1
test=*# insert into funktionen values (2, 'Funktion 2');
INSERT 0 1
test=*# insert into einheit values (3, 'Einheit 3');
INSERT 0 1
test=*# insert into mitarbeiter_funktion_einheit values (1, '[2019-07-01, 2019-07-10)',1,2,3);
INSERT 0 1

Wenn Du jetzt versuchst, einen Eintrag für Mitarbeiter 2 anzulegen, wird das nicht klappen, weil für den die Stammdaten noch fehlen:

Code:
test=*# insert into mitarbeiter_funktion_einheit values (2, '[2019-07-10, 2019-07-14)',2,2,3);
FEHLER:  Einfügen oder Aktualisieren in Tabelle »mitarbeiter_funktion_einheit« verletzt Fremdschlüssel-Constraint »mitarbeiter_funktion_einheit_mitarbeiter_fkey«
DETAIL:  Schlüssel (mitarbeiter)=(2) ist nicht in Tabelle »mitarbeiter« vorhanden.

Wenn Du jetzt versuchst, Mitarbeiter 1 noch einmal für einen zum ersteren Zeitraum überlappenden Zeitraum einzugeben, wird das auch nicht gehen:

Code:
test=*# insert into mitarbeiter_funktion_einheit values (3, '[2019-07-8, 2019-07-14)',1,2,3);
FEHLER:  kollidierender Schlüsselwert verletzt Exclusion-Constraint »mitarbeiter_funktion_einheit_mitarbeiter_von_bis_excl«
DETAIL:  Schlüssel (mitarbeiter, von_bis)=(1, [2019-07-08,2019-07-14)) kollidiert mit vorhandenem Schlüssel (mitarbeiter, von_bis)=(1, [2019-07-01,2019-07-10)).
test=*#

Du wirst vermutlich TSRANGE nehmen wollen, ich wollte mir jetzt Tipparbeit sparen ;-)
 
Zurück
Oben