Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide à la création de tables

types de champs et indexs

    9 novembre 2010 à 15:03:01

    Bonjour à tous,

    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.

    Merci d'avance,

    Ealon
    • Partager sur Facebook
    • Partager sur Twitter
    Kwo:re / topic OC | Aidez les autres, indiquez un sujet résolu ! | Vous êtes bloqué ? Suivez le guide ! | N'aide pas par MP
      9 novembre 2010 à 16:42:07

      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)
      • Partager sur Facebook
      • Partager sur Twitter
        9 novembre 2010 à 17:02:38

        Merci pour ta réponse

        Citation : Lord Casque Noir

        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 :euh:

        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.

        Merci d'avance pour votre aide.
        • Partager sur Facebook
        • Partager sur Twitter
        Kwo:re / topic OC | Aidez les autres, indiquez un sujet résolu ! | Vous êtes bloqué ? Suivez le guide ! | N'aide pas par MP

        Aide à la création de tables

        × 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.
        • Editeur
        • Markdown