OnlineLiga howto

hi,
also ich habe mir bereits ein paar Gedanken gemacht wie ich eine OnlineLiga (Rennliga) programmiertechnisch am Sinnvollsten gestalte.

Nun hab ich folgendes Problem.

Mysql: Tabelle "player_account"

id, nickname, vehicleid, leagueid ( Da ein Fahrer nur in einer Liga aktiv mitfahren darf ist die Leagueid direkt hier eingetragen! )

Mysql: Tabelle "league"

id, name, tracks, usw

So nun soll ich die Tabelle "league" die Playerids rein. Dies könnte man zB so machen 3,6,3,7,12,65,43 und mit php könnte man diese Werte exploden. Nun soll aber auch die Punktezahl der Fahrer eingetragen werden und dazu eine Übersicht der letzten Rennen wer welchen Platz hatte usw. Mein Prob ist das ich nur ungern die explode Funktion nutzen möchte.
 
Hast du ne persönliche Abneigung gegen explode?

Als ich damals ne Liga programmiert hab, hab ich es auch mit explode gemacht, da du
dann nur eine einzige Tabellenabfrage brauchst, anstatt wenn du mehrere Tabellen nutzt.


greetz ph0x
 
also ich tippe mal auf ein schlechtes db design, wenn du die playerids so abspeicherst (mit komma getrennt) dann kannst du ja keine richtigen selects kreieren.

kannst du mal ein wenig mehr infos posten....also db-schema und abfrage
 
Hi, also danke das du mir helfen willst

Also ich habe mir folgendes Überlegt

Tabelle - player_account

id, username, passwd, leagueid,vehicleid,

Tabelle - vehicle

id, name, imageurl, markid

Tabelle - mark

id,name, imageurl

Tabelle - league

id, name, ..........

Und genau hier hakt es. Ich weiss nicht genau wie ich nun die Spieler hier einsortieren soll und die Punkte der Spieler eintragen soll.
 
also das mit dem explode ist wirklich ne schlechte lösung. wie soox schon sagte, es spricht nicht für ein gutes datenbankdesign mehrere werte in einer spalte zu haben.

@spy
wozu willst du die spieler eigentlich in "league" einsortieren? wäre doch doppelt gemoppelt, weil du hast doch schon die leagueid in "player" drin. also wenn du alle spieler der jeweiligen liga haben willst, brauchst du doch nur alle spieler aus "player" selektieren wo leagueid den entsprechenden wert hat.

für die punktzahl und rennen geschichte würde ich es so machen das du eine tabelle "rennen" hast in der rennen-spezifische daten wie rennenID, leagueID, zeitpunkt und was du sonst noch so brauchst drin stehen.
dazu würde ich für jede liga eine tabelle "PlatzierungenLigaX" (X=ID der Liga) erstellen (rennenId, platz, playerid, punktzahl) wobei rennenID && platz primärschlüssel sind, denn dadurch ist es unmöglich platzierungen doppelt einzutragen für ein rennen (könnte ja mal passieren).
in diesen tabellen stehen dann also alle platzierungen aller rennen einer bestimmten liga.

für die gesamtpunktzahlen würde ich dann funktionen schreiben, die entsprechende Selects ausführen.
also für die gesamtpunktzahlen einer liga dann zB ne funktion die folgendes Select statement ausführt: "Select playerID, SUM(punkte) AS gesamtpunktzahl FROM PlatzierungenLigaX".
einfacher wäre das gleich als sicht(view) in der DB zu machen, kommt aber drauf an ob deine DB sichten unterstützt (bei mysql erst ab version 5.0).

das ist das was mir so spontan einfällt. vielleicht hat soox noch ne andere/bessere lösung.
 
hab mir mal so meine gedanken schnell zusammengeklickt.

das mit den mehreren tabellenxy (mit xy fuer platzhalter) macht in meinen augen wenig sinn...

das mark zeugs interpretiere ich mal als (auto)marke.

der ligaid in bei den accounts ist fuer die aktuell eingetragene liga.....



Code:
-- MySQL dump 9.11
--
-- Host: localhost    Database: test
-- ------------------------------------------------------
-- Server version       4.0.20

--
-- Table structure for table `liga`
--

CREATE TABLE liga (
  id int(11) NOT NULL auto_increment,
  liganame varchar(50) NOT NULL default '',
  firstgame timestamp(14) NOT NULL,
  lastgame timestamp(14) NOT NULL default '00000000000000',
  PRIMARY KEY  (id)
) TYPE=MyISAM;

--
-- Dumping data for table `liga`
--

INSERT INTO liga VALUES (1,'meine liga',20050304184312,20060309000000);

--
-- Table structure for table `mark`
--

CREATE TABLE mark (
  markid int(11) NOT NULL auto_increment,
  name varchar(100) NOT NULL default '',
  imageurl varchar(255) NOT NULL default '',
  PRIMARY KEY  (markid)
) TYPE=MyISAM;

--
-- Dumping data for table `mark`
--

INSERT INTO mark VALUES (1,'sauber-petronas','http://www.wasbinich.com');

--
-- Table structure for table `player_account`
--

CREATE TABLE player_account (
  playerid int(11) NOT NULL auto_increment,
  ligaid int(11) NOT NULL default '0',
  username char(50) NOT NULL default '',
  passwd char(32) NOT NULL default '',
  PRIMARY KEY  (playerid)
) TYPE=MyISAM;

--
-- Dumping data for table `player_account`
--

INSERT INTO player_account VALUES (1,1,'testuser','e22a63fb76874c99488435f26b117e37');

--
-- Table structure for table `rennen`
--

CREATE TABLE rennen (
  rennenid int(11) NOT NULL auto_increment,
  ligaid int(11) NOT NULL default '0',
  datum timestamp(14) NOT NULL,
  rennenname varchar(100) NOT NULL default '',
  PRIMARY KEY  (rennenid)
) TYPE=MyISAM;

--
-- Dumping data for table `rennen`
--

INSERT INTO rennen VALUES (1,1,20050304184847,'grosser preis von honolulu');
INSERT INTO rennen VALUES (2,1,20050304184847,'grosser preis des habos');

--
-- Table structure for table `result`
--

CREATE TABLE result (
  userid int(11) NOT NULL default '0',
  rennenid int(11) default NULL,
  punkte int(11) NOT NULL default '0'
) TYPE=MyISAM;

--
-- Dumping data for table `result`
--

INSERT INTO result VALUES (1,1,30);
INSERT INTO result VALUES (1,2,20);

--
-- Table structure for table `vehicle`
--

CREATE TABLE vehicle (
  vehicleid int(11) NOT NULL auto_increment,
  vehiclename varchar(100) NOT NULL default '',
  imageurl varchar(255) NOT NULL default '',
  markid int(11) NOT NULL default '0',
  PRIMARY KEY  (vehicleid)
) TYPE=MyISAM;

--
-- Dumping data for table `vehicle`
--

INSERT INTO vehicle VALUES (1,'mein f1 mobil','http://...',1);

und hier mal eine bsp abfrage der punktezahl eines users
Code:
mysql> select user.username, res.punkte from player_account as user LEFT JOIN result AS res ON (res.userid = user.userid);
+----------+--------+
| username | punkte |
+----------+--------+
| testuser |     30 |
| testuser |     20 |
+----------+--------+
2 rows in set (0.00 sec)

mysql> 
mysql> select sum(punkte),  user.username, res.punkte from player_account as user LEFT JOIN result AS res ON (res.userid = user.userid) GROUP BY username;
+-------------+----------+--------+
| sum(punkte) | username | punkte |
+-------------+----------+--------+
|          50 | testuser |     30 |
+-------------+----------+--------+
1 row in set (0.00 sec)

mysql>
natuerlich muesste man hier noch mit inner joins zur liga weitergehen, damit ich nur die punkte einer liga zusammenzaehle


...das mal so meine gedanken
 
Zurück
Oben