Userverwaltung mittels IDs, namen abfragen zu serverlastig?

Marius Heil

Erfahrenes Mitglied
Hi,

ist eher so ne Grundsatzfrage, es heißt ja zb, man sollte doppelte Inhalte vermeiden, ich verwalte die User mittels IDs, sodass sie die Möglichkeit haben ihren Usernamen sowie ihre UserID zu ändern, allerdings bekommt man immer bestimmte Listen ausgegeben, welche mittels der UserID abgefragt werden, der user soll dann jedoch die Usernamen anstatt die IDs angezeigt bekommen.
Was meint ihr jetzt, wäre das beste:
1: Ich durchsuche für jeden Lsiteneintrag die Userdatenbank und suche die Entsprechenden Usernamen raus.
2: Ich notiere in der Liste zusätzlich zu den IDs jeweils noch den Username, dieser wäre dann unter Umständen veraltet, allerdings müsste ich ihn nicht suchen.


Marius
 
Du speicherst den Benutzernamen genau einmal, in der Usertabelle. Weitere Identifizierungen eines Users machst Du über seine ID.
Alles andere wäre "Datenbankblödsinn".

Gruß hpvw
 
Das ist mir klar, dass sich das so gehört, ich bin auch grade so am programmieren, dass das hinkommt, hatte anfangs nen Fehler gemacht, den beheb ich gerade, es ist halt so, dass:
Ich brauche bei einer Abfrage ein liste der ganzen User, mit Username, Datum und Wetteinsatz, es ist halt so, dass ich den Username als einzigstes nicht in dieser Liste drinhabe, da die user über die ID identifizeirt werden.
Ich finde es halt jetzt etwas umständlich 20 Anfragen an die Datenbank zu stellen, in einer Schleife, welche alle Zugehörigen namen zu den IDs abfragt, das ist einzusehen, oder?


Marius
 
Marius Heil hat gesagt.:
Ich finde es halt jetzt etwas umständlich 20 Anfragen an die Datenbank zu stellen, in einer Schleife, welche alle Zugehörigen namen zu den IDs abfragt, das ist einzusehen, oder?
Ja, das ist aber auch der falsche Weg.
Ein kurzes Beispiel:
SQL:
select
  einsaetze.wetteId as wetteId,
  einsaetze.einsatz as einsatz,
  #...
  user.id as userId,
  user.name as userName
from einsaetze
join user
  on einsaetze.userId=user.id
Gruß hpvw
 
Hi,

danke, ich merk schon, dass es vielleciht doch sinnvoll wäre ein Buch über MySQL zu lesen, aber mir hat bisher keins gefallen, deshalb hab ich auch keins durchgelesen, ich schlag mich meistens mit StandartMySQL Anweisungen durch, die in den meisten Fällen genügen.
Wäre denn diese Abfrage so korrekt?:

SQL:
SELECT 
   kaempfe.UserID,
   kaempfe.GegnerID,
   kaempfe.Einsatz,
   kaempfe.Kampfdatum,
   kaempfe.AutoId,
   user.Username
FROM kaempfe JOIN user ON kaempfe.GegnerID=user.ID 
WHERE UserID = 35 
ORDER BY Kampfdatum DESC

so wie ich das hier angezeigt bekomme kann ich mir die ganzen AS sparen.
Sie hat zumindest so funktioniert, was ist eigentlich wenn ich die ganzen "kaempfe." weglasse? Die Abfrage hat trotzdem ohne Probleme funktioniert,....


Marius
 
Du bestimmst nach dem select welche Felder Du in der Ergebnistabelle sehen willst. Wenn Du die Daten aus der Tabelle kaempfe nicht alle benötigst, musst Du sie auch nicht projezieren (so nennt man die Auswahl der Felder).
In Deinem Beispiel kannst Du die Aliasnamen (as aliasname) weglassen, da die Felder alle eindeutig benannt sind. Auch in meinem Beispiel sind die Aliasnamen überflüssig (ist so ein Tick von mir, die immer mit aufzuschreiben). Nur bei user.id könnte es in meinem Beispiel relevant werden, wenn die Tabelle einsaetze auch eine id hätte, die auch projeziert werden sollte.

Gruß hpvw

EDIT: Vielleicht ist Deine Aussage auch anders zu verstehen: Wenn Du in zwei Tabellen der Selektion (die Auswahl der Tabellen) gleichbenannte Felder hast, ist es zwingend, dass Du in der Projektion auch den Tabellennamen angibst, damit die Auswahl eindeutig ist. Sind in allen Tabellen die Felder unterschiedlich benannt, kann man den Tabellennamen weglassen. Ich habe mir allerdings aus Gründen der Wiedererkennung und Übersichtlichkeit angewöhnt, den Tabellennamen immer mit anzugegeben, wenn mehr als eine Tabelle von dem Query betroffen ist. Bei Deiner UserID erhöht es meiner Meinung nach zum Beispiel die Übersichtlichkeit, wenn Du die Tabelle mit angibst, auch beim where. Wäre die on-Bedingung nicht da, wäre nicht ersichtlich, aus welcher Tabelle die UserID kommt.
 
Zuletzt bearbeitet:
Hi,

vielen Dank, dann kann ich das ja offenbar so lassen, mir gehts nicht allzusehr um die Übersichtlichkeit, die Spalten sind zufällig anderst benannt, von daher passt es.
Mir geht es meistens darum die Anweisungen recht klein zu halten, da sie in PHP sowieso nicht mehr allzu übersichtlich sind in den Strings drin.


Marius
 
Jetzt hätte ich noch ne kleine Frage, was mache ich, wenn ich 2 Sachen joinen muss?
Ich habe ein userID und eine GegnerID, zu beiden brauche ich nun den Usernamen.

Marius
 
Du gibst der Tabelle jeweils einen anderen Aliasnamen und verknüpfst zwei mal. Ein Beispiel:
SQL:
select
  g.id as gegnerID, # man beachte den Aliasnamen der Tabelle
  g.name as gegnerName,
  u.id as userID,
  u.name as userName
from kampf
join user as g # das as darf hier auch weggelassen werden
  on kampf.gegnerID=g.id
join user u # hier wurde es weggelassen
  on kampf.userID=u.id
Gruß hpvw
 
Ok, ich glaub ich habs soweit ;)
ist etwas unsortiert, aber zumindest ging es so:

SQL:
SELECT k.UserID, k.GegnerID, k.Kampfdaten, k.KampfdatenG, k.FigurWahl, k.BildWahl, k.Einsatz, k.Gewonnen, k.Energieb, k.SkillO, k.SkillM, k.SkillU, k.Energie, k.SkillOb, k.SkillMb, k.SkillUb, u.username AS UserName, g.username AS GegnerName FROM kaempfe AS k JOIN user u ON k.UserID=u.ID JOIN user AS g ON k.GegnerID=g.ID WHERE AutoId=22 LIMIT 1

Vielen Dank für die Hilfe, das hätte ich sonst nicht ohne weiteres hinbekommen.


Marius
 
Zurück