Datenbank für Anwesenheitsliste - Tipps

zzt7g6z

Neuer Benutzer
Beiträge
4
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!
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.042
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?

Letzteres definitiv NICHT! Beschäftige Dich mit Normalisierung.

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!

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
 

zzt7g6z

Neuer Benutzer
Beiträge
4
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?
 

akretschmer

Datenbank-Guru
Beiträge
9.042
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?

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

Gute Güte, die Normalisierung ist ja echt eine Wissenschaft für sich...

Nun ja, lohnt sich aber.

Eine Frage zur zweiten Normalenform: Ist es nachteilig, wenn ich da quasi einen neuen, künstlichen Primärschlüssel erzeuge?

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

zzt7g6z

Neuer Benutzer
Beiträge
4
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?
 

akretschmer

Datenbank-Guru
Beiträge
9.042
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?

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ß.
 
Werbung:

zzt7g6z

Neuer Benutzer
Beiträge
4
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 ;)
 
Oben