normalisatie - kritiek graag
*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
Quote:
geen indexen: er worden telkens nieuwe records toegevoegd/geupdate | vandaar die Primary keys
Quote:
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
Gewijzigd op 01/01/1970 01:00:00 door Eduard
(ben dus nu beetje bij beetje beginnen bekijken hoe ik mijn gegevens zou kunnen opslaan - maar wacht nog af voor mogelijke veranderingen in mijn db moht ik er iets fout hebben gedaan)
Gewijzigd op 01/01/1970 01:00:00 door M Ypma
Deze server schrijft allerlei gegevens tijdens de matchen in een .txt bestandje waaruit ik allerlei gegevens ophaal (later met cronjob)
daaruit haal ik dus de volgende gegevens:
(kzal ze in het engels opnoemen):
nickname (kan veranderd worden, maar mogen geen dubbele tegelijkertijd zijn)
client id [cl_id] (id van de speler binnen de speler op het ogenblik van de match*)
guid (uniek per person/MAC adres)
team (2 mogelijkheden, of anders offline)
kills
deaths
* ik heb 'cl_id' nodig om 'team' te kunnen bepalen, om dan te kunnen zien of er geen "teamkills" zijn om die dan van de 'kills' te kunnen aftrekken
Mijn opzet nu is dus zo goed mogelijke db te maken waarmee ik al die gegevens in een tabel kan printen, een soort van een statistieken pagina
Quote:
Deze server schrijft allerlei gegevens tijdens de matchen in een .txt bestandje waaruit ik allerlei gegevens ophaal (later met cronjob)
Waarom schrijf jeh et naar een textbestandje, je hebt toch een Database en PHP? Wat voor type applicatie maakt gebruik van deze gegevens?
Eduard schreef op 08.04.2008 23:41:
wat bedoel je met je laatste zin/vraag?
Hij bedoelt waarschijnlijk: Waarom de game het exporteert naar een .txt bestand. Welk ander programma dan de game zelf maakt gebruik van dat .txt bestand?
Je naamgeving kan inderdaad beter. We kunnen nu niet uit de namen van je variabelen opmaken waar ze over gaan. Wat is bijv. guid? En waarom gebruik je een combinatietabel? Is de relatie players <-> guids van het type veel op veel?
Quote:
Welk ander programma dan de game zelf maakt gebruik van dat .txt bestand?
die text bestandje dient eigenlijk enkel ter controle, mocht je iets willen gaan opzoeken als er iets niet zou kloppen, dus amper 1% van de mensen gebruiken het, en mijn opzet was om er een statistiek van te maken
@Jan:
een guid is een 32 lange letter/cijfer id dat uniek is per MAC Adres, dus als je instaat ben tom je mac adres te veranderen, dan wordt je een andere guid toegewezen
die combinatie tabel heb ik eigenlijk bkomen tijdens het normaliseren, dacht dat het zo moest, maar oorspronkelijk, voordat ik het normaliseren nog begon te leren, toen had ik guid nog samen met de nickname
als ze guid, nickname samen ouden zijn, dan zou guid meermaals voorkomen, dus mischien dat ik daarom die 2 apart gezet heb, dus denk ik dat het nu is van het type veel op veel ja
Gewijzigd op 01/01/1970 01:00:00 door Eduard
en ik kan er maar geen query bedenken die per guid/nickname zal limiten, dus denk ik dat mijn normalisatie mislukt is
een guid kan aan maardere nickname's hangen... maar een nickname gan geen merdere guids hebben. Tenminste dat stel je net... dat is gewoon een 1 op veel relatie en maakt je koppeltabel overbodig.
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 =/
Gewijzigd op 01/01/1970 01:00:00 door Eduard
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...
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)
Foreign keys en relaties. Dit is handig en hoef je dus niet met een klote txt file te werken.
Ik zie ook nergens 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
Gewijzigd op 01/01/1970 01:00:00 door Eduard
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
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
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
Gewijzigd op 01/01/1970 01:00:00 door Eduard
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 =/
PLAYERS
id [PK]
nickname [UNIQUE]
cl_id
GUIDS
guidID [PK]
nickname [FK]
guid
type
TEAM
guidID [FK]
team
kills
deaths
datetime
mijn doel:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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
}
?>
$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
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Eduard
-- 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