1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

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

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von thobr, 24 Juli 2019.

  1. thobr

    thobr Neuer Benutzer

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

    akretschmer Datenbank-Guru

    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 ;-)
     
    Walter gefällt das.
  3. thobr

    thobr Neuer Benutzer

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

    akretschmer Datenbank-Guru

    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 ;-)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden