Je suis tombé sur cet article hier, et je me suis rendu compte que mes bases ne sont pas du tout optimisées, ni pensées de façon à être fiables et rapides. Comme je projette d'avoir des dizaines de millions d'enregistrements, je m'en remets à vous afin de m'aider.
Je vais vous expliquer mon projet, ainsi que ce que j'ai pour le moment.
Le projet
Je vais générer des images aléatoire dont je vais stoker les informations suivantes en BDD:
Id image
Hash MD5
Code Hexa1
Code Hexa2
Date de génération
Par ailleurs, je vais proposer un système de votes par top/flop. Un top serait représenté par un 1, et un flop par un 0. Je voudrais conserver en BDD tous les votes pour réaliser des statistiques. Je pensais faire ainsi:
Id image
Id membre
Vote
Date de vote
De plus, j'aurais ma table des membres, qui contiendra peu d'informations:
Id membre
Pseudo
Password
Date inscription
Cependant, on m'a conseillé d'insérer dans la table des images des champs pour compter les votes, et idem dans la table des membres, afin d'alléger les requêtes de statistiques et la charge du serveur.
Ce que j'ai en place
Base des images:
CREATE TABLE IF NOT EXISTS `image` (
`id_image` mediumint(7) unsigned NOT NULL auto_increment,
`md5_image` char(32) collate latin1_general_ci NOT NULL,
`hexo_image` char(6) collate latin1_general_ci NOT NULL,
`hexc_image` char(6) collate latin1_general_ci NOT NULL,
`creation_image` datetime NOT NULL,
`top_image` smallint(4) unsigned NOT NULL,
`flop_image` smallint(4) unsigned NOT NULL,
PRIMARY KEY (`id_image`),
UNIQUE KEY `md5_image` (`md5_image`),
KEY `hexo_image` (`hexo_image`,`hexc_image`,`top_image`,`flop_image`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;
Base des votes:
CREATE TABLE IF NOT EXISTS `votes` (
`id_image` mediumint(7) unsigned NOT NULL,
`id_membre` mediumint(7) unsigned NOT NULL,
`vote_note` tinyint(1) unsigned NOT NULL,
`vote_soumission` tinyint(1) unsigned NOT NULL,
`ss` int(1) NOT NULL,
KEY `id_image` (`id_image`,`id_membre`,`vote_note`,`vote_soumission`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
Base des membres :
CREATE TABLE IF NOT EXISTS `membre` (
`id_membre` mediumint(7) unsigned NOT NULL auto_increment,
`membre_pseudo` varchar(20) collate latin1_general_ci NOT NULL,
`membre_pass` char(32) collate latin1_general_ci NOT NULL,
`membre_email` varchar(60) collate latin1_general_ci NOT NULL,
`membre_inscription` datetime NOT NULL,
`membre_daltonien` tinyint(1) unsigned NOT NULL,
`membre_votes` mediumint(7) unsigned NOT NULL,
PRIMARY KEY (`id_membre`),
UNIQUE KEY `membre_pseudo` (`membre_pseudo`),
KEY `membre_pass` (`membre_pass`,`membre_email`,`membre_daltonien`,`membre_votes`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;
Par contre, j'ai quelques soucis, premièrement sur le type des champs, ainsi que les indexs.
Je pense avoir fait au mieux, mais j'aimerais bien votre avis.
L'article de phpfrance ne sert à rien et donne autant de mauvais conseils que de bons.
Alors, dans les problèmes, je vois :
- utilisation de myisam
- utilisation de mediumint/smallint (pourquoi faire ?)
- si tu veux économiser de la place, plutôt que de couper des ints en 4, mets ton md5 en BLOB (et pas en hexa)
- utilisation de latin1 au lieu d'utf8
- index sur (`hexo_image`,`hexc_image`,`top_image`,`flop_image`) : je suppose que ce n'est pas ce que tu veux, probablement tu voulais 4 index je pense
- index sur (`id_image`,`id_membre`,`vote_note`,`vote_soumission`) : même remarque- index sur (`membre_pass`,`membre_email`,`membre_daltonien`,`membre_votes`) : idem
- vote_soumission et ss : c'est quoi ?
- oubli des foreign keys
- noms des champs : utilise la même convention partout, par exemple si tu mets membre_pseudo, mets image_md5 et pas md5_image, ça t'évitera des erreurs d'inattention
sinon la structure de la base est bonne (sauf les index et les foreign keys)
L'article de phpfrance ne sert à rien et donne autant de mauvais conseils que de bons.
Je n'en savais rien, je pensais que ça se greffait bien au tutos du SdZ en complément. Autant pour moi!
Citation : Lord Casque Noir
- utilisation de myisam
Je pense que tu me conseilles d'utiliser InnoDB. Peux-tu expliquer pourquoi?
Citation : Lord Casque Noir
- utilisation de mediumint/smallint (pourquoi faire ?)
A vrai dire, je n'en sais rien, j'ai fait en fonction de ce que j'ai lu et compris de l'article.
Citation : Lord Casque Noir
- si tu veux économiser de la place, plutôt que de couper des ints en 4, mets ton md5 en BLOB (et pas en hexa)
Là par contre, je n'ai pas compris... Pour moi, une chaine retournée par MD5 est hexadécimale...
Citation : Lord Casque Noir
- index sur (`hexo_image`,`hexc_image`,`top_image`,`flop_image`) : je suppose que ce n'est pas ce que tu veux, probablement tu voulais 4 index je pense
- index sur (`id_image`,`id_membre`,`vote_note`,`vote_soumission`) : même remarque
- index sur (`membre_pass`,`membre_email`,`membre_daltonien`,`membre_votes`) : idem
Exactement, mais je ne savais pas que c'était différent. Comment faire dans ce cas?
Citation : Lord Casque Noir
- vote_soumission et ss : c'est quoi ?
vote_soumission -> datetime de quand est inséré le vote.
ss -> j'en sais rien ... Je pense à une erreur du nombre de champs que je n'ai pas rectifiée.
Citation : Lord Casque Noir
- oubli des foreign keys
Je ne vois pas trop ce que sont les foreign keys
Citation : Lord Casque Noir
- noms des champs : utilise la même convention partout, par exemple si tu mets membre_pseudo, mets image_md5 et pas md5_image, ça t'évitera des erreurs d'inattention
C'était prévu, mais j'ai du faire une erreur d'inattention lors de la création...
Comme vous pouvez le voir, il reste certains points à éclaircir.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.