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

Datenbank für Anwesenheitsliste - Tipps

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von zzt7g6z, 11 November 2013.

  1. zzt7g6z

    zzt7g6z Neuer Benutzer

    Hallo!

    Ich würde gerne für die Arbeit eine Abwesenheitsliste programmieren. Wie sollte ich da am besten die DB entwerfen? Wir haben ca. 70 Mitarbeiter, Neueinstellungen sind nicht häufig. Kann ich da eine Tabelle für alle erstellen? Oder doch lieber pro Mitarbeiter eine Tabelle? Es sollten erfasst werden:
    Name,
    Vorname,
    E-Mail,
    Tel-Nr,
    Abteilung (sieben zur Auswahl),
    Status (drei zur Auswahl),
    Passwort
    und Abwesenheit (Urlaub, anderer Standort, anwesend...), wobei die Abwesenheit das EInzige ist, was die Mitarbeiter selber eintragen.

    Für TIpps und Erfahrungen bin ich sehr dankbar!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Letzteres definitiv NICHT! Beschäftige Dich mit Normalisierung.

    Das sind mindestens folgende Tabellen:

    • Mitarbeiter mit den Stammdaten inkl. Passwort
    • Abteilungen
    • Status
    • Zuordnung, welcher Mitarbeiter in welcher Abteilung ist, evtl. mit Zeitangabe von-bis
    • Tabelle, welche die Abwesenheiten enthält, mit Fremdschlüssel auf Mirarbeiter

    Ich bin mir nicht ganz sicher, was bei Dir mit Status gemeint ist. Falls Du, was in der Realität oft der Fall ist, auch abbilden willst, daß man 2 oder mehr Mailadressen und Tel-Nummern hat, brauchst dazu auch noch Tabellen.

    Andreas
     
  3. zzt7g6z

    zzt7g6z Neuer Benutzer

    Vielen Dank zunächst für deine Antwort!

    Also bei Status ist es so: Entweder ist jemand Gruppenleiter oder Teillgruppenleiter oder "normaler" Mitarbeiter.

    Zwei oder mehr E-Mail-Adressen gibt es hier nicht. Telefonnummern eventuell, wenn wir die Handynr. auch verwalten wollen.

    Was noch hinzukommt ist: Es müsste für jeden Mitarbeiter möglich sein, dass er pro Tag seine Abwesenheit eintragen kann und die dann für andere sichtbar ist. Müsste man dann noch für jeden Monat eine eigene Tabelle erstellen? Oder wie setzt man solche Kalenderfunktionen datenbanktechnisch am besten um?

    Gute Güte, die Normalisierung ist ja echt eine Wissenschaft für sich...
    Eine Frage zur zweiten Normalenform: Ist es nachteilig, wenn ich da quasi einen neuen, künstlichen Primärschlüssel erzeuge?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Nein. Es sei denn, du hast je Monat schon einige Millionen Datensätze, dann könnte man über monatsweise Partitionierung nachdenken.

    Nun ja, lohnt sich aber.

    Du meinst sowas wie eine laufende ID als PRIMARY KEY? Nein, das ist ganz okay.
     
  5. zzt7g6z

    zzt7g6z Neuer Benutzer

    Okay, dann kann man sich im Prinzip bei der 2. NF die Suche nach dem/den Primärschlüssel(n) sparen. Dann nehme ich einfach eine neue ID.

    Das mit dem Kalender ist mir noch nicht ganz klar, wie das umzusetzen wäre. Es muss ja möglich sein, dass z. B. mit dem Mitarbeiter Nr. 15 verküpft ist, dass er am 05.05.2014, und vom 07.08..2014 bis zum 20.08.2014 u. Ä. abwesend ist oder Urlaub hat. Wenn ich jetzt alle Mitarbeiter in einer Tabelle habe und eine Tabelle andere mit den 6-7 versch. Abwesenheitsytpen, dann hätte ich ja eine N:N-Beziehung und bräuchte eine Tabelle, wo pro Tag pro Mitarbeiter eingetragen ist, welchen Abwesenheitstyp er hat... sehe ich das richtig?

    Also Z. B. Tabelle Abwesenheiten (Abwesenheitstyp_ID,Mitarbeiter_ID, Datum) wobei die Kombination aus den dreien der Primärschlüssel wäre. Und dann stünde da bspw. 2 (für Urlaub),15 (Mitarbeiter 15) und 20.10.2013. Und in der nächsten Zeile: 2,15,21.10.2013... wenn er an dem Tag auch noch Urlaub hat.

    Stelle ich mir das so richtig vor?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ja. Da Urlaub meist über mehrere Tagen geht, könnte man das auch via von und bis zusammenfassen - oder gleich als DATERANGE, falls man eine DB hat, die sowas kann - also PostgreSQL ;-)

    Ich würde aber einen extra PK führen, der wäre dann kleiner. Aber - Geschmackssache. Oder aber: via EXCLUSION CONSTRAINT sicherstellen, daß ein Mitarbeiter zu jedem Zeitpunkt nur eine definierte Abwesenheit hat.

    Code:
    test=# create table abwesenheit (mitarbeiter int, typ int, abwesend daterange, exclude using gist (mitarbeiter with =, abwesend with &&));
    CREATE TABLE
    Time: 243,742 ms
    test=*# insert into abwesenheit values (1,1,'(2013-11-01,2013-11-20]');
    INSERT 0 1
    Time: 0,367 ms
    test=*# insert into abwesenheit values (1,1,'(2013-11-10,2013-11-30]');
    ERROR:  conflicting key value violates exclusion constraint "abwesenheit_mitarbeiter_abwesend_excl"
    DETAIL:  Key (mitarbeiter, abwesend)=(1, [2013-11-11,2013-12-01)) conflicts with existing key (mitarbeiter, abwesend)=(1, [2013-11-02,2013-11-21)).
    Time: 10,020 ms
    
    Der 2. Bereich schneidet sich mit dem ersten Bereich.
    Das kann aber nur PostgreSQL, soweit ich weiß.
     
  7. zzt7g6z

    zzt7g6z Neuer Benutzer

    Wir haben Microsoft SQL Server. Aber gut, es müsste ja auch ohne funktionieren.

    Andreas, vielen, vielen Dank!! Du hast mir echt sehr geholfen! Ich setz mich die nächsten Tage an das Projekt dran und dann mal schauen, wann ich die ersten Probleme habe ;)
     
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