[MySQL] Werden Fremdschlüssels IDs automatisch übernommen (Normalisierung)?

cola1

Mitglied
Hi,

habe grade eine Blockade beim Lernen und komme nicht weiter.
In der Datenbank gibt es nun 3 Tabellen, nämlich eine für den "user", dessen "spielfigur" und dessen "geld". Nun sollten diese Tabellen normalisiert sein, bevor mit diesen gearbeitet wird. Also fing ich an mit IDs und Fremdschlüsseln zu arbeiten:

"user":
userid,username,email,password,lastlogin usw.

"spielfigur":
charid,userid,,charname,level,exp,geld usw

"geld":
geldid,geldname,geldmenge


Problem1 liegt darin, dass ich nicht weiß wohin mit dem Geld :D
Ich meine nach der Normalisierung müsste das Geld doch in eine extra Tabelle, so wie oben. Allerdings wären dann nur geldid und geldname darin, die Menge dann in der Tabelle spielfigur.
Oder soll die Menge der verschiedenen Geld-Währungen doch in die Tabelle geld und die charid kommt mit in die Tabelle geld? Wären das nicht zu viele Einträge (falls ein User mehrere Spielfiguren hat und es im Spiel meherere Währungen gibt)?!

Problem2 ist ein sehr grundlegenes, da ich nicht weiß wie die Foreign Keys arbeiten. Ziehen die sich die IDs von den Referenzen automatisch, oder muss ich bei einer Registrierung bzw. Erstellung einer Spielfigur in die ganzen verschiedenen (normalisierten) Tabellen schreiben?

Stellen wir uns vor es gibt noch Items, mehrere Währungen usw... das wären ganz schön viele UPDATES bei der Erstellung einer Spielfigur.

Hoffe jemand kann hier auch Licht ins Dunkel bringen :) Danke im Vorraus, per Mausklick usw :D
 
Hey,

ist ein Webhosting Paket mit phpMyAdmin und MySQL (hier auswählbar ca 7 Einträge auch MyISAM und InnoDB. Habe die Datenbanken mit InnoDB "erstellt".
 
Wenn du nur eine Währung hast, dann ist die Tabelle 'geld' für die Katze und du könntest beim char eine Spalte geld anlegen.
Hast du jedoch mehrere Währungen, dann bräuchtest du noch eine Tabelle mit den Währungen (und ggf. dem Umrechnungsfaktor zur Leitwährung (Ich geh davon aus, dass du kein Börsensystem hast bei dem der Kurs wechselt).
Das lohnt sich aber nur, wenn du nicht einfach Kupfer/Silber/Gold in 1/10/100 speichern willst.

Code:
waehrungen
*wid | name     | kurs
---------------------
1    | Kupfer   | 1
2    | Silber   | 10
3    | Gold     | 100
4    | Dublonen | 66


geld
*uid | *wid | menge
-----------------
1    | 1    | 15
1    | 3    | 3
1    | 4    | 133
5    | 1    | 6

*Schlüsselfelder

Das heisst, Char 1 hat 15 Kupfer, 3 GOld und 133 Dublonen. Char 5 hat 6 Kupfer. Char 2-4 haben gar kein Geld.

So ähnlich sieht es nachher auch mit items usw. Eine Tabelle in der die Items, ihr Kaufwert und ihr Gewicht stehen. Dann eine tabelle in der der char und das item mit der Menge verlinkt werden


Du brauchst beim INSERT nicht in jeder Tabelle einen Eintrag zu erstellen. Die Einträge kommen dann dazu, wenn der Char ein Item bekommt, Geld bekommt etc.

Nachtrag: Habs ins DB Forum verschoben
 
öhm - ist doch klar. Nicht?
Du hast dann ja 1:n Bezeihungen. Mit den Keys hast ud eine saubere Verknüpfung.
 
Mensch steh ich noch so weit am Anfang?! :D

Die DB ist eventuell richtig normalisiert und durch saubere Verknüpfungen noch performanter, dafür müssen im Code häufiger verschiedene Tabellen angesprochen werden?

Wenn eine Spielfigur nun Geld bekommt passiert:
SQL:
"UPDATE geld 
SET 1 = 1 + $gold,
SET 2 = 2 + $silber,
SET 3 = 3 + $kupfer
WHERE ID = $ID"

Oder? Richtig? Verzweiflung?
 
Demnach wäre dein Statement so besser formuliert:
SQL:
UPDATE geld 
SET 
   gold = gold + $gold,
   silber = silber + $silber,
   kupfer = kupfer + $kupfer
WHERE ID = $ID

Allerdings kannst du auch bei deinen "nichts aussagenden" Spaltennamen (1,2,3) bleiben.
 
Zuletzt bearbeitet:
oder in meinem Datenbeispiel

SQL:
-- Kupfer
INSERT INTO geld (uid, wid, menge)
VALUES({$userid}, 1, {$kupfer})
ON DUPLICATE KEY UPDATE menge = menge+{$kupfer};

Also versuchen die Währungs-Userkombination einzufügen. Wenn sie schon existiert, dann die Kupfer hinzufügen.

Und etwa gleich für Gold etc.
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück