Zitat von
gsh:
Zitat von
Der_Unwissende:
erstmal eine Frage:
Zitat von
gsh:
Was ich bis jetzt mir überlegt habe:
Usertabelle:
(PrimärKey) UserID INT(10) Not Null Auto Inc
(PrimärKey) Username VARCHAR(100) Not Null
password VARCHAR(32) Not Null
email VARCHAR(100) Not Null
displayname VARCHAR(100)
Warum deklarierst Du hier einen zusammengesetzten Primary Key aus UserID und Username? Schon die ID identifiziert einen Benutzereindeutig, somit auch den Nutzernamen. Umgekehrt gilt das allerdings auch. Der Username muss schließlich im System eindeutig vergeben werden, entsprechend reicht dieser Name völlig aus um einen Nutzer eindeutig zu identifizieren. Wenn Du nicht auf ein O/R-Mapper setzt (oder ein anderes Tool/Framework/etc. einsetzt), welches eine künstliche ID bedingt, dann solltest Du die UserID einfach wegfallen lassen.
Die UserID und den Usernamen hab ich aus folgendem Grund: Die UserID ist die eindeutige ID für diesen User. Bei einer anderen Tabelle (z.b. Avatar) wird diese ID dann verwendet, um den jeweiligen Eintrag einem User zuordnen zu können. Den Usernamen will ich dafür nicht verwenden, da es 1. ein Name ist (Feld muss größer sein) und 2. vielleicht einmal von dem User oder von mir geändert werden kann.
Noch kurz warum ich zwei Primär Keys hab:
Ich denke, ein select sollte man immer nur auf einen identizierten Eintrag durchführen. Da sich der User über den Usernamen anmeldet, brauch ich den am Anfang und dann verwendet der Server nur noch die UserID zur Identifikation.
Als Primary Key würde ich
immer einen "synthetischen" Key verwenden (synthetisch im Sinne von, hat keinen Zusammenhang mit der realen Welt), insbesondere dann, wenn aus anderen Tabellen per Foreign Key darauf referenziert werden soll (als Referenz ist ein Varchar natürlich sehr ungeeignet)... um die Eindeutigkeit des Username sicherzustellen, würde sich ein Unique Key gut eignen:
SQL-Code:
(Primary Key) UserID INT(10) Not Null Auto Inc
(Unique Key) Username VARCHAR(100) Not Null
password VARCHAR(32) Not Null
email VARCHAR(100) Not Null
displayname VARCHAR(100)