Datenbankdesign für eine Zeiterfassungsanwendung

7

Ich entwerfe das Datenbankschema für eine Zeiterfassungsanwendung und benötige einen kleinen Ratschlag. Die Anwendung muss es dem Benutzer ermöglichen, für jeden Wochentag die Zeit einzugeben, die er für ein bestimmtes Projekt gearbeitet hat. Was wäre Ihrer Meinung nach der beste Weg, um diese Werte zu speichern?

Psyche
quelle

Antworten:

11

Schauen Sie sich das Arbeitszeittabellenmodell auf databaseaseanswers.org an. Das deckt es gut ab

Einfach ein Tisch mit

  • Datum
  • Benutzer (FK zu Benutzertabelle)
  • Projekt (FK zur Projekttabelle)
  • Die Zeit hat gearbeitet

Die ersten 3 Spalten sind PK.

Wollen Sie jetzt:

  • Protokollaktivität zB Analyse, Codierung, separat testen?
  • Projektphasen separat protokollieren?
  • Nicht-Projektarbeit protokollieren, z. B. Schulung, Urlaub (z. B. Benutzerfokus oder Projektfokus?)
  • ...
gbn
quelle
Nettes Model gbn, danke. Ich muss Projektphasen oder Analyse / Codierung / Test nicht separat protokollieren, aber ich muss nicht projektbezogene Arbeiten protokollieren.
Psyche
1
Ich habe in meiner Zeit ein paar Arbeitszeittabellen-Apps erstellt und möchte nur eine Optimierung hinzufügen. Verwenden Sie anstelle eines zusammengesetzten Schlüssels eine Ersatzidentitätsspalte für die PK. In jedem System, mit dem ich gearbeitet habe, muss immer außerhalb des Systems über bestimmte Zeiteinträge kommuniziert werden, und es ist einfacher, nur eine Referenznummer als eine dreiteilige Kennung zu verwenden. Außerdem werden die Zeiteinträge häufig verknüpft (z. B. mit Rechnungen), und Sie erhalten eine bessere Leistung beim Verknüpfen eines einzelnen Ganzzahlfelds.
JohnFx
@ JohnFx Ich stimme vollkommen zu. Es gibt keinen Grund, nicht einfach eine int identitySpalte am Anfang dieser Tabelle abzulegen.
Nate
1
@ JohnFx: Die Wahl des natürlichen Schlüssels oder des Ersatzschlüssels ist hier nicht möglich. Sie benötigen auch noch einen eindeutigen Index für den natürlichen Schlüssel = mehr Speicherplatz, Overhead. Eine IDENTITÄT sollte auch keine äußere Bedeutung haben. Sie sind nicht falsch, aber Ihre Punkte haben nichts mit meiner Antwort zu
tun
Das war ein Verweis auf Ihren Kommentar "Die ersten drei Spalten sind die PK", das ist alles.
JohnFx
2

In unserer Zeiterfassungsanwendung speichern wir auch die Start- und Endzeiten der Arbeit. Wir fügen der Datenbank für jede einzelne Aufgabe an einem bestimmten Tag eine neue Zeile hinzu und berechnen die Summe, bevor wir sie anzeigen. Überlegen Sie, ob diese Informationen in Zukunft nützlich sein werden. Es ist sehr schwierig, sie später zu integrieren. Es ist nicht zu kompliziert, die Zeilen eines Tages zu gruppieren.

Jim - Clockodo Zeiterfassung
quelle
1

Ich würde eine Join-Tabelle verwenden, die den Benutzer mit einem Projekt verbindet und auch die zusätzlichen Daten speichert

  user   |    project    |    time     |   date
-------------------------------------------------
    1            39           360        27/09/2011
    2            4            60         27/09/2011
    6            34           500        27/09/2011
    5            34           320        27/09/2011
    12           37           720        27/09/2011
    7            34           50         27/09/2011

Die Zeit ist hier in Minuten, kann aber auch in Sekunden angegeben werden (obwohl dies möglicherweise überentwickelt ist).

Natürlich können Ihre Schlüssel für Benutzer und Projekt unterschiedlich sein, aber ich denke, Sie verstehen, was ich meine.

DrColossos
quelle
0

Ich habe zuvor eine Zeiterfassungsanwendung erstellt, mit der der Administrator nur die Zeiten aktualisieren kann. Sie möchten nicht, dass ein einzelner Benutzer seine Stunden bearbeiten kann, da Betrug ein Problem sein kann. Wenn jemand vergisst, sich anzumelden, kann der Administrator einfach die Stunden bearbeiten. Wenn der Benutzer jedoch einen Kunden hat und die Stunden nicht seine eigenen sind, sollte er in der Lage sein, die Stunden für den Kunden zu bearbeiten, jedoch nicht für sich selbst als Mitarbeiter.

Ich hatte eine Benutzertabelle mit dem Namen, der E-Mail-Adresse, der letzten Aktion usw. des Benutzers und eine usertimestampTabelle mit den tatsächlichen Schlägen.

id int auto_increment
user_id int
action -- whether the user has clocked in, out etc.
clock timestamp -- defaults to the current timestamp
notes text -- allow the user to leave notes if they are late
realtime timestamp -- this is the actual time the punch happened before any editing by an administrator for auditing purposes
ipaddress varchar(255) -- prevent the user from clocking in or out from a place other than designated unless authorized to clock in from anywhere

Dies ist einfach der usertimestampTisch, aber ich denke, das ist alles, was Sie wirklich gesucht haben. Ich habe auch zulässige IPs, eine Firmentabelle (da sie eine Liste von IPs eingeben können), Kunden für ein Unternehmen (getrennt von Mitarbeitern) und Kundenzeitstempel, um die Kundenzeiten für die Rechnungsstellung für separate Unternehmen zu verfolgen, die Sie möglicherweise basierend auf hinzufügen möchten Deine Bedürfnisse.

Jonathan Hickman
quelle