Datenbank-Design für Registrierung

zer0

Erfahrenes Mitglied
Hallo :)

Ich bin seit gestern am überlegen für das richtige Datenbank Design. Ich habe ein Registrierung mit anschließender Aktivierung durch ein Code der per Mail versandt wird.

Meine erste Idee war zwei getrennte Tabellen, einmal User und einmal Registration. Nach der Aktivierung wird ein Teil des Inhalts der Registration Tabelle in die User Tabelle übertragen. Den Vorteil seh ich hier das ich einfach über die Registration Tabelle gehe und alle Einträge älter als 24h rausschmeiße falls nicht aktiviert!

Alternative wäre eine Spalte in der User Tabelle 'acitve', die entweder true oder false ist. In einer weiteren Tabelle müsste ich zusammen mit der UserID den Aktivierungscode und das Erstellunsdatum speichern. Hier wäre es ein wenig aufwendiger die abgelaufenen User raus zu schmeißen da ich über zwei Tabellen operieren muss.

Was haltet ihr für sinnvoller, oder gibts noch eine weiter alternative/verbesserungen?
 

Nico Graichen

Erfahrenes Mitglied
Und wieso nicht alles in einer Tabelle?
Du hast keinerlei Vorteile, die Infos auszulagern. Zum einen gehören sie zum User, zum anderen beeinflusst es die Laufzeit beim Speichern und Löschen negativ
 

zer0

Erfahrenes Mitglied
Weil ich ja spezielle Metadaten habe die ich am nach der Aktivierung nicht mehr brauche. Zum Beispiel der Aktivierungscode.
 

Nico Graichen

Erfahrenes Mitglied
Hi

Das erklärt aber nicht, warum du den Laufzeitverlust (und zusätzlichen Speicherbedarf) in Kauf nehmen willst.
Für eine Abfrage der Userdaten kannst du die Spalten ja weglassen
 

zer0

Erfahrenes Mitglied
Ja natürlich kann ich die Spalten bei der Abfrage weglassen. Aber wenn ich für jeden User ein Aktivierungcode (z.B. 32 Zeichen MD5 Hash) speicher, obwohl dieser nicht benötigt wird da der User sein Account aktiviert hat, dann verschwende ich ja schon Speicher!

Ich brauche also eine Möglichkeit den Aktivierungscode separat zu speichern, sodass er nach der Aktivierung wegfallen kann. Und ich muss natürlich in der User Tabelle kennzeichnen ob der User bereits aktiv ist.
 

Nico Graichen

Erfahrenes Mitglied
Die Möglichkeit brauchst du nicht zwingend. Du brauchst den Aktivierungscode nicht mal in der DB sondern du brauchst ihn genau zweimal: Beim Versenden und beim anschließenden Vergleichen. Davor, dazwischen und danach brauchst du den Code nicht und musst ihn somit auch nicht persistieren
 

zer0

Erfahrenes Mitglied
Ich kann dir leider nicht ganz folgen. Das ich ihn nach der Aktivierung nicht mehr brauche ist mir klar. Aber irgendwo muss er abgelegt werden solange bis der User sein Account per Mail aktiviert. Ich will vllt auch die Möglichkeit bieten das man sein Account sofort benutzen kann, noch bevor man ihn Aktiviert hat über die Mail.
 

Steiner_B

Erfahrenes Mitglied
Hallo,

Aus reiner Datenmodellierungssicht wäre es am günstigsten die letzte von dir erwähnte Variante zu wählen, wobei du sogar darauf verzichten kannst eine active Spalte zu führen. Die Information ob ein User aktiviert ist oder nicht ergibt sich dann einfach daraus, dass aktivierte User keine Zeile in der zweiten Tabelle haben.

Von der Variante mit nur einer Tabelle würde ich stark abraten, eben aus dem von dir schon oben genannten Grund des Speicherverbrauchs. Und im Normalfall wirst du ein große Menge an aktivierten Nutzern haben, und nur sehr wenige die noch aktiviert werden müssen --> viel unnötiger Speicherverbrauch.
 

zer0

Erfahrenes Mitglied
Hallo :)

Von der ersten Variante werde ich jetzt auch absehen!

Bei der zweiten von mir genannten Variante müsste ich bei jedem Login natürlich auch prüfen ob der User in der Aktivierungstabelle vorhanden ist. Deswegen dachte ich an eine Spalte 'active'.

Mir kam jetzt auch eine dritte Idee:
Nur eine Tabelle User mit der Spalte 'active'. Falls diese auf 'false' steht hat der User sein account nocht nicht aktiviert. Der Aktivierungscode ist der Hash aus seiner ID, Username und Passwort, gegebenfalls auch noch das Erstellungsdatum. Hier würde ich eine ganze Tabelle sparen.

Was meint ihr dazu? Bin auch offen für weitere Vorschläge :)
 

Nico Graichen

Erfahrenes Mitglied
Ich kann dir leider nicht ganz folgen. Das ich ihn nach der Aktivierung nicht mehr brauche ist mir klar. Aber irgendwo muss er abgelegt werden solange bis der User sein Account per Mail aktiviert. Ich will vllt auch die Möglichkeit bieten das man sein Account sofort benutzen kann, noch bevor man ihn Aktiviert hat über die Mail.

Hi

Du kannst denn Schlüssel doch bei Bedarf erzeugen. Dieser wird doch sicherlich anhand der Userdaten generiert.
Demzufolge kannst du in bei der Aktivierung durch den User generieren. Der User sendet den Aktivierungscode, du generierst den Code auf dem Server und vergleichst beide

Der Nachteil der Prüfung des Vorhandenseins von Datensätzen in der zweiten Tabelle ist neben Laufzeitverlust beim Speichern und Löschen auch noch ein Laufzeitverlust beim Lesen während des Logins