Het is de eerste keer dat ik normalisatie moet toepassen en er zullen dus hoogstwaarschijnlijk hier en daar fouten zijn, neem ik aan, maar kritiek is meer dan welkom =)

*nickname = spelersnaam
*guid = unieke id, per computer, dus meerde nicknames kunnen dezelfde guid hebben
*cl_id wordt toegewezen bij het joinen van een server

Mijn 3NV:
-----------

PLAYERS
nicknameID [PRIMARY KEY auto_increment]
nickname [UNIQUE constraint]

GUIDS
guidID [PRIMARY KEY auto_increment]
guid [UNIQUE constraint]

COMBINATIE
id [PRIMARY KEY auto_increment]
nicknameID
guidID

INFO
id [PRIMARY KEY auto_increment]
cl_id [???]

TEAM
cl_id [???]
team
kills
deaths

geen indexen: er worden telkens nieuwe records toegevoegd/geupdate | vandaar die Primary keys


In de laatste tabel (team), kan cl_id helaas een NULL retourneren, niet alle records zijn dus uniek, en het wordt daarenboven telkens geupdated/toegevoegd, dus weet ik er weinig raad mee


mocht iets onduidelijk zijn, laat het maar weten
ah juist, geen COMBINATIE dus, maar dan hangen guids en nicknames niet meer samen, dus moeten ze eigenlijk in 1 tabel?

PLAYERS
nicknameID [PRIMARY KEY auto_increment]
nickname [UNIQUE constraint]
guid

Als ik de volgende gegevens nu wil selecteren:

SELECT nicknameID, nickname, guid
FROM players
ORDER BY nicknameID DESC
LIMIT 1

dan zit ik mis met die limit, eigenlijk wil ik maar 1 resultaat per guid, en hier kom ik er niet aan uit =/
nee niet in 1 tabel... je zei dat meerdere nicknames hetzelfde guid kunnen hebben. dat is een 1 op veel relatie. Je houdt ze dus wel in apparte tabellen en geeft nickname een verwijzing naar een guid.

Je probleem met je limit snap ik echter niet...? je wilt maar 1 resultaat maar met je limit ga je mis?... you've lost me...
aha thanks, nu begrijp ik de logica =)

wel met die limit... ik wil de SELECT enkel tot unieke guids beperken, dus 't is niet dat ik 1 resultaat wil hebben, maar 1 per uniek guid, waarbij ik het laatst toegewezen nickname als spelersnaam zal selecteren (dus descending orderen en dan limit 1 ofzo)
Ik zie ook nergens Foreign keys en relaties. Dit is handig en hoef je dus niet met een klote txt file te werken.
Jurgen schreef op 12.04.2008 11:57
Ik zie ook nergens Foreign keys en relaties. Dit is handig en hoef je dus niet met een klote txt file te werken.



zonder txt bestand geen grafiek/stats, dat is de enigste manier waarop dat spel zijn stats weergeeft,

PLAYERS
id [PK auto_increment]
nickname [UNIQUE constraint]
cl_id

GUIDS
nickname [FK]
guidID [PK auto_increment]
guid
datetime

TEAM
guidID [FK]
team
kills
deaths
als je altijd de laatste nickname wilt selecteren per guid, dan zul je in je tabel een kolom erbij moeten maken met het type DATETIME, zo kun je de laatste selecteren.
Ik heb nu deze query, maar ik kom niet uit hoe ik die beperking kan inbouwen (enkel unieke guids toegekend aan laatst toegevoegde nickname)


SELECT  p.nickname,
	g.guid,
	t.team,
	t.kills,
	t.deaths
FROM	players AS p
INNER JOIN guids AS g
	ON p.nickname = g.nickname
 INNER JOIN team as t
	 ON g.guidID = t.guidID
ORDER BY datetime DESC
ik heb het nu kunnen omzeilen met een extra attribut (nieuw varchar(3) DEFAULT 'ja').

Dus als we ervan uitgaan dat er 0 records in de db zijn en als ik een record toevoeg, dan is die nieuw ('ja'), maar als er nog ene record toegevoegd wordt, waarvan de guid al in de database voorkomt...dan update ik de attribut(en) van de nickname van bestaande overeenkomstige guid naar 'nee' en het nieuwe record blijft gewoon standaard 'ja', en dan laat ik enkel de records met een 'ja' zien


Dit is natuurlijk niet echt professioneel aangezien je het waarschijnlijk gewoon met een sql kunt doen (=mijn vraag in vorige post), maar ik kan het maar niet fixen =/
Mijn grootste twijfel zit in de db ontwerp, ik maak me zorgen dat ik 2 keer nickname erin heb, al gebruik i ker ene als Foreign Key (ben niet zeker of het kwaad kan)

PLAYERS
id [PK]
nickname [UNIQUE]
cl_id

GUIDS
guidID [PK]
nickname [FK]
guid
type

TEAM
guidID [FK]
team
kills
deaths
datetime



mijn doel:


<?php

$sql="SELECT type
	FROM guids
	WHERE nickname=".$nickname."
	AND guid=".$guid."";
$res=mysql_query($sql);

if(mysql_num_rows($res)<1){
//INSERT query...type=new
}else{
//UPDATE type naar 'old' van vorige nicknames van deze guid
//INSERT query...type=new
}

?>
nieuwe update:

-- players
+++ id [P.K. A.I.]
+++ nickname [U.Q.]
+++ cl_id

-- guids
+++ id [P.K. A.I.]
+++ id_nick [F.K.]
+++ guid
+++ type

-- team
+++ id_guid [F.K.]
+++ team
+++ kills
+++ deaths
+++ datetime

Reageren