JeuWeb - Crée ton jeu par navigateur
[Débats] Créer sa base de données - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Débats] Créer sa base de données (/showthread.php?tid=560)

Pages : 1 2 3 4


RE: [Débats] Créer sa base de données - dark_vidor - 26-12-2006

très :respect:

vivement que j'apprenne l'objet ... Smile


RE: [Débats] Créer sa base de données - joshua - 26-12-2006

ne mets pas des smiley comme ca jevais rougir ^^
J'ai fait au plus simple!


RE: [Débats] Créer sa base de données - dark_vidor - 26-12-2006

questions :
ça fait pas faire plus de requete pour recupere tout ce qu'un joueur a sur une planetes ?
mon prof de sql/php m'a dit d'eviter la redondance des données es ce que c'est vraiment le cas avec ton schéma ?


RE: [Débats] Créer sa base de données - joshua - 26-12-2006

e n'ai aucune redoncdance de données;
La seule redondonca qu'il y a, c'est les id qui sont passés d'une table a l'autre.
mais non ca ne fait pas faire plus de requetes; car quand tu initialise un joueur a sa connection, je vais chercher ses planetes et les ressources associées a ses planetes (ca fait partie de l'intitialisation). Après je n'y touche plus sauf lors de mises à jour et lorsque le cookie de session est mort ^^


RE: [Débats] Créer sa base de données - trosken - 26-12-2006

D'aprés ce que je vois de ce schéma , il y a des tables qui pourrait etre regroupées en une seule , ce qui éviterait des jointures .

Effectivement ,il faut éviter les redondances (sauf dans certains cas : une information dont tu aurait souvent besoin et qui demanderait un calcul complexe) mais il faut aussi éviter de multiplier les tables . L'astuce , c'est de regarder les cardinalités des relations entre les tables . Si tu as du 1:1 , du 0:1 , du 1:2 ou n'importe quellle cardinalité avec des nombres finis , c'est que tu peux regrouper .


RE: [Débats] Créer sa base de données - joshua - 26-12-2006

bien d'accord avec toi trosken: a un bemol près: parfois la lisibilité de la table gagne beaucoup a maintenir une cardinalité finie.
Donc il arrive parfois, surtout pour des tables qui sont peu appelées, que l'on laisse la table splittée.


RE: [Débats] Créer sa base de données - dark_vidor - 28-12-2006

je fait actuellement quelques tests

j'ai creer une table bidon
Code :
--
-- Structure de la table `game_biens`
--

CREATE TABLE `game_biens` (
  `id_biens` int(8) unsigned NOT NULL auto_increment,
  `id_users` int(8) unsigned NOT NULL default '0',
  `id_units` int(8) unsigned NOT NULL default '0',
  `id_source` int(8) unsigned NOT NULL default '0',
  `stock` tinyint(1) NOT NULL default '0',
  `resistance` varchar(16) NOT NULL default '',
  `experience` varchar(16) NOT NULL default '',
  PRIMARY KEY  (`id_biens`,`id_users`,`id_units`,`id_source`)
)

Code PHP :
<?
#-----[ Paramètres de Configuration ]----------------------
$host = 'localhost';
$user = 'root';
$base = 'test';
$pass = '';
$db = mysql_connect ($host, $user, $pass);
mysql_select_db ($base,$db);

#-----[ Temps d'Execution ]--------------------------------
function microtime_float()
{
list(
$usec, $sec) = explode(" ", microtime());
return ((float)
$usec + (float)$sec);
}
$time_start = microtime_float();

#-----[ Construction du tableau de joueurs ]---------------
for( $i=0 ; $i<=200 ; $i++ )
{
$array_joueurs[$i] = round(rand(1,2)).substr(round(rand(1000001,1999999)), 1);
}

for(
$i=201 ; $i<=210 ; $i++ )
{
$array_joueurs[$i] = '3'.substr(round(rand(1000001,1999999)), 1);
}

#-----[ Insertion en BDD ]--------------------------------
for( $i=0 ; $i<=1000000000 ; $i++ )
{
$sql = 'INSERT INTO game_biens SET '
.'id_users = '.$array_joueurs[round(rand(0,210))].', '
.'id_units = '.round(rand(0,300)).', '
.'id_source = '.round(rand(0,300)).', '
.'stock = '.round(rand(1,3)).', '
.'resistance = '.round(rand(0,300)).', '
.'experience = '.round(rand(0,300)) ;

echo
$sql.'<br>';
mysql_query($sql);

}

#-----[ Temps d'Execution ]--------------------------------
$time_end = microtime_float();
$time = $time_end - $time_start;
$time = substr($time, 0, strpos($time, ".")).substr(strstr($time, '.'), 0 , 4);
return
'Page générée en '.$time.' secondes';
?>

Je me suis arreter un peu avant la fin du milliard ^^

Je voulais tester l'acessibilité aux données sur une grosse table
Citation :Nb d'enregistrements : 919250
Nb de joueurs team1 : 422693
Nb de joueurs team2 : 453004
Nb de joueurs team3 : 43553
Page générée en 9.968 secondes

Bon seulement problème ...

Code PHP :
<?php 
$sql
= 'SELECT id_biens FROM game_biens';
$req = mysql_query($sql);
echo
'<br>Nb d\'enregistrements : '.mysql_num_rows($req);
Si je met que ça il me met : Page générée en 4.573 secondes ; quand j'execute ma requete direct sous phpmyadmin

Citation :Affichage des enregistrements 0 - 29 (919250 total, traitement: 0.0004 sec.)
requête SQL:
SELECT id_biens
FROM game_biens
LIMIT 0 , 30

d'ou viens une telle différence ? j'veux bien que l'affichage de ma page soit plus long mais la quand même sacré difference :heuuu:^^


RE: [Débats] Créer sa base de données - Loetheri - 28-12-2006

LIMIT y est peut-être pour quelque chose ;-)

Entre prendre 30 éléments et tous les 919250 éléments, il y a un pas.


RE: [Débats] Créer sa base de données - dark_vidor - 28-12-2006

le limit se rajoute tout seul dans phpmyadmin je peux donc pas tester combien ça lui prends de temps pour afficher la requete :heuuu:


RE: [Débats] Créer sa base de données - Loetheri - 28-12-2006

C'est bien pour ça que je dis que PHPMyAdmin est un programme de merde Smile
Si, si, je vous l'assure.

Pour ma part, j'ai fait des tests sans le vouloir entre une base de données de 63001 entrées et 225 entrés. Je n'ai subi aucun changement grave pour récupérer le même nombre de données.

Je pense qu'il peut y avoir beaucoup de différences si tu utilises un type de table plutôt qu'un autre et/ou si tu ne mets pas de clés ou mal (ça, j'en suis sûr).