PDA

Vollständige Version anzeigen : Frage zu Tabellenstrukturen


flew
16.10.2011, 21:03
Hallo zusammen,

ich muss ein paar Fehler aus meiner DB ausmerzen, daher arbeite ich nochmal von Grund auf alles in dieser DB durch.

Ich speichere Arbeitszeiten, typischerweise gibt es keine Tagesübergreifenden, kann jedoch vorkommen -> würdet ihr in diesem Fall drei Felder anlegen, ArbeitszeitDatum (Datum), ArbeitszeitBeginn (Uhrzeit), ArbeitszeitEnde (Uhrzeit), oder nur zwei, ArbeitszeitBeginn (Datum + Uhrzeit), ArbeitszeitEnde (Datum + Uhrzeit)
Zweite Variante hätte ja den Nachteil, dass ich in Abfragen, für die nur das Datum relevant ist, das Datum dort herausformatieren o.ä. müsste (könnte also langsamer werden ?)

Desweiteren speichere ich Abwesenheiten (Urlaub, Schule etc.).
Eine Arbeitszeit ist immer einem Projekt aus der tblProjekte zugeordnet, die tblArbeitszeiten hat also den Fremdschlüssel ProjektID, würdet ihr die Abwesenheiten mit in die tblProjekte und entsprechend kennzeichnen ? Oder einen zweiten Fremdschlüssel mit in die tblArbeitszeiten (falls dann bspw. Schule, dann würde ja die ProjektID einen Nullwert erhalten) oooooder sollten die Abwesenheiten in eine extra Tabelle, wobei diese dann ja bis auf den Fremdschlüssel die identische Struktur hätte ?

Grüße
flew

ebs17
16.10.2011, 21:18
Zum ersten Punkt - Datum und Uhrzeit getrennt oder gemeinsam:
Ich würde das von der überwiegenden Auswertung abhängig machen.

Berechnungen auf Felder verhindern in der nachfolgenden Auswertung (Filtern, Gruppieren, Sortieren) eine Indexnutzung, somit richtigerweise das Herausformatieren eines Datums, aber gleichlautend auch das Addieren von Datum und Zeit. Da in einer Anwendung sicher beide Fälle vorkommen werden, müsste man abwägen, wo der Nachteil geringer ist.
Z.B. kann man durch eine konsequente enge Filterung Datenmengen gering halten und so eine Indexnutzung praktisch verzichtbar machen.

flew
16.10.2011, 21:43
Ja um die Indexnutzung und darum, nicht überflüssig viele Felder zu haben, denn ich fragte mich was dagegen spricht, Datum unD Zeit nicht in ein Feld zu speichern.

Access speichert Datums- und Zeitwerte ja als Double-Zahl, so ist ja der 16.10.2011 21:30 Access-intern ja eine 40832,8958333333. Wenn ich also Stunden berechne, hindern mich das ja nicht ob ich nun bspw. 0,75 - 0,25 = 0,5 oder ob ich 2,75 - 2,25 = 0,5 berechne, ist ja derselbe Rechenaufwand. Also spräche für dieses Anliegen nichts gegen eine Speicherung von Datum und Zeit in einem Feld ?

Desweiteren filtere ich oft nach Monaten, bspw. Oktober 2011. Access-intern ist der 1.10.2011 die 40817, der 31.10.2011 die 40847. Wenn ich mir alle Datensätze des Oktobers anzeigen lassen möchte, könnte ich doch auch ohne Formatierung der Datums-Zeit-Kombi abfragen "..... WHERE ArbeitszeitBeginn >= 40817 AND ArbeitszeitEnde <= 40847", so wird der Index auf diesem Feld ja weiterhin genutzt, oder ?

(EDIT:
Wobei ich dann noch irgendwie berücksichtigen müsste, zu welchem Tag denn eine tages- und monatsübergreifende Arbeitszeit gehört, bspw Beginn: 30.09.2011 22:00 Ende: 01.10.2011 06:00, diese würde ich mit obiger WHERE ja weder in den Sepmtember, noch in den Oktober schieben)

ebs17
16.10.2011, 21:54
WHERE ArbeitszeitBeginn >= 40817 AND ArbeitszeitEnde <= 40847", so wird der Index auf diesem Feld ja weiterhin genutzt
Richtig, wobei der Monat nicht am 31.10. 0:00 Uhr endet.
Wenn ich mir alle Datensätze des Oktobers anzeigen lassen möchte, könnte ich doch auch ohne Formatierung der Datums-Zeit-Kombi abfragen
Die Vermeidung von Berechnungen auf ein Tabellenfeld durch eine andere Kriteriensetzung ist immer ein gutes Mittel. Die Vergleichswerte (hier die Zeitgrenzen) werden in der Abfrage nur einmal berechnet (sofern sie nicht ihrerseits von Tabellenfeldern abhängen), und das ist zeitunkritisch.

Zum ersten Punkt: Wenn man eine Differenz aus zwei, drei oder vier Werten bildet, ist hinsichtlich Indexnutzung egal. Berechnung ist Berechnung.

flew
16.10.2011, 21:58
Okay, wenn ich dich richtig verstanden habe, wäre dem Vorgehen mit Datum und Zeit in einem Feld also nichts zu entgegnen ?

Muss ich mir nur noch überlegen wie ich den monatsübergreifenden Datensatz berücksichtige

Arne Dieckmann
16.10.2011, 22:01
Um bei deinem Beispiel zu bleiben, muss aus
ArbeitszeitEnde <= 40847
dann
ArbeitszeitEnde < 40848
werden.


Nachtrag: sorry, das war wohl gar nicht das Problem. Vergiß bitte diesen Beitrag.

ebs17
16.10.2011, 22:08
wenn ich dich richtig verstanden habe, wäre dem Vorgehen mit Datum und Zeit in einem Feld also nichts zu entgegnen ?
Ein genannter Fall schließt aber andere mögliche noch nicht aus. Daher wäre ich bei einer so absoluten Aussage etwas zurückhaltend.

achtelpetit
16.10.2011, 22:12
Ich würde einfach nur Beginn und Ende des Zeitabschnitts speichern, Datum und Uhrzeit. Dann kann Dir wurscht sein, ob die betrachtete Zeitspanne einen Tages- oder Monatswechsel beinhaltet.
Du kannst einfach und schnell abfragen und das Abfrageergebnis praktisch ohne Performanceverlust nach belieben formatieren.

Diese Anwesenheits / Abwesenheits-Kiste würde ich mit 5 Tabellen lösen:
1) Mitarbeiter
Mitarbeiter-Id | Vorname | Familienname | usw.

2) Zeitnutzung
Zeitnutzung-Id | Zeitnutzung (Projektarbeit, Schule, krank, Urlaub)

3) Zeiterfassung
Zeiterfassung-Id | Mitarbeiter-Id | Beginn | Ende | ZeitNutzung-Id

4) Projekte
Projekt-Id | Projekt

5) Zeiterfassung-Projekt
Zeiterfassung-Id | Projekt-Id

Der Mechanismus dürfte klar sein: es wird jede Zeit erfasst und dabei zwischen den verschiedenen Arten der Zeitnutzung unterschieden. Wenn die Zeit für ein Projekt genutzt wurde, gibt es eben noch einen Eintrag in "Zeiterfassung-Projekt", das läßt sich ganz gut automatisieren.

flew
16.10.2011, 22:43
Ich würde einfach nur Beginn und Ende des Zeitabschnitts speichern, Datum und Uhrzeit. Dann kann Dir wurscht sein, ob die betrachtete Zeitspanne einen Tages- oder Monatswechsel beinhaltet.
Du kannst einfach und schnell abfragen und das Abfrageergebnis praktisch ohne Performanceverlust nach belieben formatieren.

Verstehe ich nicht, heißt das, dass du vier Felder (zwei Mal Datum, zwei Mal Zeit) anlegen würdest oder zwei (zwei Mal Datum/Zeit) ?


Zu deiner Tabellenstruktur, ja das sieht ganz gut aus, wäre ich so nicht drauf gekommen, mit diesen n:m Bindetabellen (ZeiterfassungProjekt) bin ich irgendwie noch nicht ganz firm. Wobei sich bei dieser Variante ja die Eintragung einer Projektarbeitszeit etwas aufwändiger darstellt

achtelpetit
16.10.2011, 23:08
Da habe ich mißverständlich formuliert: ich meine 2 Felder, jeweils als "Datum/Uhrzeit" definiert. Die Argumente dafür hast Du ja selber schon gezeigt; es wird ohnehin ein Double gespeichert.

Wobei sich bei dieser Variante ja die Eintragung einer Projektarbeitszeit etwas aufwändiger darstellt
Das kann man leicht automatisieren und auch im Bedienformular sehr komfortabel gestalten.
Als Quelle für die Auswahl der "Zeitnutzung" nimmst Du eine UNION-Abfrage von "Zeitnutzung" und "Projekte". Wenn nun ein Projekt als Zeitnutzung gewählt wird, machst Du per VBA einen Eintrag sowohl in "Zeiterfassung" als auch in "Zeiterfassung-Projekt". Der User merkt nix von 2 Tabellen.

flew
16.10.2011, 23:12
Okay vielen Dank an alle für Tipps / Hinweise / Erklärungen und auch Bedenken, dann werde ich an meiner bisherigen Struktur etwas ändern müssen.

Grüße