Partage
  • Partager sur Facebook
  • Partager sur Twitter

Structurer une BDD...Pas évident

    6 mai 2011 à 1:10:13

    Salut à tous,
    J'ai une BDD mais elle ne m'offre pas la flexibilité que je souhaiterait atteindre...

    -- phpMyAdmin SQL Dump
    -- version 3.2.0.1
    -- http://www.phpmyadmin.net
    --
    -- Serveur: localhost
    -- Généré le : Jeu 05 Mai 2011 à 23:06
    -- Version du serveur: 5.1.36
    -- Version de PHP: 5.3.0
    
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    
    --
    -- Base de données: `aerandir`
    --
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `account`
    --
    
    CREATE TABLE IF NOT EXISTS `account` (
      `id` mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
      `name` char(40) NOT NULL,
      `password` char(40) NOT NULL,
      `mail` text NOT NULL,
      `question` char(4) NOT NULL,
      `answer` text NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    
    --
    -- Contenu de la table `account`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `armor`
    --
    
    CREATE TABLE IF NOT EXISTS `armor` (
      `id` mediumint(9) NOT NULL,
      `physicalDef` smallint(6) NOT NULL,
      `magicalDef` smallint(6) NOT NULL,
      `enduranceRequired` tinyint(4) NOT NULL,
      `requiredLevel` tinyint(4) NOT NULL,
      `requiredClass` tinyint(4) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `armor`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `boots`
    --
    
    CREATE TABLE IF NOT EXISTS `boots` (
      `id` mediumint(9) NOT NULL,
      `dodge` tinyint(4) NOT NULL,
      `requiredLevel` tinyint(11) NOT NULL,
      `requiredClass` tinyint(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `boots`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `equipment`
    --
    
    CREATE TABLE IF NOT EXISTS `equipment` (
      `playerId` mediumint(9) NOT NULL,
      `type` enum('helmet','necklace','ring','weapon','armor','boots') NOT NULL,
      `equipmentId` mediumint(11) NOT NULL,
      `quality` tinyint(4) NOT NULL,
      `craft` tinyint(4) NOT NULL,
      `idGem1` tinyint(4) NOT NULL,
      `idGem2` tinyint(4) NOT NULL,
      PRIMARY KEY (`playerId`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `equipment`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `friendlist`
    --
    
    CREATE TABLE IF NOT EXISTS `friendlist` (
      `accountId1` mediumint(9) NOT NULL,
      `accountId2` mediumint(9) NOT NULL,
      PRIMARY KEY (`accountId1`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `friendlist`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `gems`
    --
    
    CREATE TABLE IF NOT EXISTS `gems` (
      `id` mediumint(9) NOT NULL,
      `type` tinyint(4) NOT NULL,
      `quality` tinyint(4) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `gems`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `gloves`
    --
    
    CREATE TABLE IF NOT EXISTS `gloves` (
      `id` mediumint(9) NOT NULL,
      `speed` tinyint(4) NOT NULL,
      `requiredLevel` tinyint(11) NOT NULL,
      `requiredClass` tinyint(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `gloves`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `helmet`
    --
    
    CREATE TABLE IF NOT EXISTS `helmet` (
      `id` mediumint(9) NOT NULL,
      `physicalDef` smallint(6) NOT NULL,
      `magicalDef` smallint(6) NOT NULL,
      `requiredLevel` tinyint(4) NOT NULL,
      `requiredClass` tinyint(4) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `helmet`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `inventory`
    --
    
    CREATE TABLE IF NOT EXISTS `inventory` (
      `playerId` mediumint(9) NOT NULL,
      `type` tinyint(4) NOT NULL,
      `idItem` tinyint(4) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `inventory`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `necklace`
    --
    
    CREATE TABLE IF NOT EXISTS `necklace` (
      `id` mediumint(9) NOT NULL,
      `Intelligence` smallint(6) NOT NULL,
      `requiredLevel` tinyint(4) NOT NULL,
      `requiredClass` tinyint(4) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `necklace`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `players`
    --
    
    CREATE TABLE IF NOT EXISTS `players` (
      `id` mediumint(9) unsigned NOT NULL,
      `accountId` mediumint(9) NOT NULL,
      `pseudo` blob NOT NULL,
      `class` tinyint(3) unsigned NOT NULL,
      `constitution` tinyint(3) unsigned NOT NULL,
      `endurance` tinyint(3) unsigned NOT NULL,
      `agility` tinyint(3) unsigned NOT NULL,
      `dexterity` tinyint(3) unsigned NOT NULL,
      `intelligence` tinyint(3) unsigned NOT NULL,
      `level` tinyint(3) unsigned NOT NULL,
      `experience` int(11) NOT NULL,
      `idMap` smallint(5) unsigned NOT NULL,
      `coordX` smallint(5) unsigned NOT NULL,
      `coordY` smallint(5) unsigned NOT NULL,
      `lastConnect` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `players`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `ring`
    --
    
    CREATE TABLE IF NOT EXISTS `ring` (
      `id` mediumint(9) NOT NULL,
      `crictical` tinyint(11) NOT NULL,
      `requiredLevel` tinyint(4) NOT NULL,
      `requiredClass` tinyint(4) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `ring`
    --
    
    
    -- --------------------------------------------------------
    
    --
    -- Structure de la table `weapons`
    --
    
    CREATE TABLE IF NOT EXISTS `weapons` (
      `id` mediumint(9) NOT NULL,
      `attackMin` smallint(11) NOT NULL,
      `attackMax` smallint(11) NOT NULL,
      `constitutionRequired` tinyint(4) NOT NULL,
      `requiredLevel` tinyint(4) NOT NULL,
      `requiredClass` tinyint(4) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `id` (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Contenu de la table `weapons`
    --
    


    Par exemple, celà me permet d'avoir plusieurs personnages sur un même compte, ce que je veux.
    Mais par exemple, je répète dans tous les equipements (necklace, armor, weapon etc) le requiredLevel et requiredClass.
    De plus, seul l'équipement équipé aura donc les attributs tels la qualitée avec ma structure actuelle, les gemmes etc, alors que j'aimerais que dans l'inventaire soient stockés tous les objets (sans craft etc) mais aussi les équipements (avec).

    Comment dois-je m'y prendre ???
    Merci d'avance :p
    • Partager sur Facebook
    • Partager sur Twitter
      6 mai 2011 à 6:33:46

      Ouaou, avec une longueur de code pareil sa va démoraliser un packet de personne (moi y compris) a vouloir fouiner la dedans.

      Un conseil essaye de modéliser tous sa, pour sa t as de super outil comme Office Vision, que tu doit télécharger, sa mettras un sens graphique a tes table et sa montreras clairement les relation entre chaqu une, de la tu pourras voir comment optimiser tous sa ;-)
      • Partager sur Facebook
      • Partager sur Twitter
        6 mai 2011 à 9:45:07

        Salut,

        comme le dit Ikariel, il serait bon que tu nous fasses un diagramme des tables ce qui est beaucoup plus lisible.

        Je peux tout de même faire quelques remarques :
        _ Tu n'implémentes aucune contrainte de clé étrangère.
        _ Certain type de données sont étranges (ex : un type TEXT pour un mail ?)
        _ Pas de contraintes d'unicité (ex : Dans ta table account, 2 utilisateurs peuvent avoir le même nom)
        • Partager sur Facebook
        • Partager sur Twitter
          6 mai 2011 à 10:05:17

          Pour le moment c'est juste la structure que je travaille, l'optimisation viendra après x)
          J'ai cherché des outils de visualisation mais j'ai rien trouvé de facile à prendre en main...

          Mais en gros, je voudrais que ma structure soit plus flexible, pas de répétition de champs requiredLevel, requiredClass pour chaque equipement différent. Que chaque équipement ait des valeurs de bases mais modifiées par la suite avec la qualitée etc...
          • Partager sur Facebook
          • Partager sur Twitter
            6 mai 2011 à 10:14:34

            Tu as implémenté ton schéma avant de faire les étapes de conception de ton schéma. Il faut faire l'inverse :)

            Sinon, tu peux utiliser MySQL WorkBench
            • Partager sur Facebook
            • Partager sur Twitter
              6 mai 2011 à 12:01:23

              Dac, c'est ce que je vais utiliser.
              J'ai un peu commencé, la prise en main est assez intuitive, mais une question pour la structure de l'équipement, le logiciel ne peut pas trop m'aider pour le coup là...

              Comment dois-je m'y prendre pour l'équipement ?
              Soit je fais une table avec tous les attributs des équipements :

              Atk physique
              Def physique
              Atk Magique
              Def Magique
              Chance de coup critique
              Chance d'esquive
              Rapiditée

              Sauf qu'aucun équipement aura tout.
              Les armures n'auront que la def, les armes que l'attaque etc...
              Comment puis-je créer une structure optimisée pour chaque type d'équipement ?

              Merci d'avance :)
              • Partager sur Facebook
              • Partager sur Twitter
                6 mai 2011 à 12:35:16

                Le logiciel n'est là que pour la visualisation mais il me semble qu'il est capable à partir d'un schéma UML (ou Entité/association) de générer le code SQL des tables de la BD. C'est déjà pas mal pour un logiciel gratuit :)

                Pour ce qui est de l'étape de conception de ta base, on commence d'abord par faire un schéma UML (ou Entité/association). Il y a pas mal d'article sur ce sujet. Ensuite, pour améliorer le schéma conceptuel, tu peux normaliser les relations dans ton schéma avec les formes normales.

                La page wikipédia sur la normalisation est pas mal faite d'ailleurs :
                Wikipédia




                • Partager sur Facebook
                • Partager sur Twitter
                  6 mai 2011 à 13:06:52

                  Dac :)
                  Aussi je voudrais savoir.
                  Quel est le mieux entre :

                  Dans la table du joueur, mettre :

                  idHelmet
                  idWeapon
                  idArmor
                  Etc...
                  Pour l'équipement équipé.


                  Ou bien faire une table Player Equipement qui contient id du joueur et l'id de l'équipement.

                  Via les IDs d'équipement il pourrait accéder au id du type d'équipement (1 = armor par exemple) et donc équiper une seule arme par exemple en verifiant si une arme est présente dans la table.

                  La 2nd solution me parait meilleure mais en codant, comme il est impossible de faire un insert et un delete ca risque d'être chaud 2 requête pour changer un truc.

                  Sauf si je met le type d'équipement dans la table PlayerEquipment mais ca deviendrait le bordel :x
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 mai 2011 à 12:10:01

                    Citation : anerax

                    Dac, c'est ce que je vais utiliser.
                    J'ai un peu commencé, la prise en main est assez intuitive, mais une question pour la structure de l'équipement, le logiciel ne peut pas trop m'aider pour le coup là...

                    Comment dois-je m'y prendre pour l'équipement ?
                    Soit je fais une table avec tous les attributs des équipements :

                    Atk physique
                    Def physique
                    Atk Magique
                    Def Magique
                    Chance de coup critique
                    Chance d'esquive
                    Rapiditée

                    Sauf qu'aucun équipement aura tout.
                    Les armures n'auront que la def, les armes que l'attaque etc...
                    Comment puis-je créer une structure optimisée pour chaque type d'équipement ?

                    Merci d'avance :)



                    ce n'est pas forcement génant.
                    modifie également l'attribut type de ta table equipement qui sera relié à une table qui contiendra le nom des types d'equipement.









                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 mai 2011 à 13:27:29

                      J'ai une table Item qui a un id en autoIncrement et un type.
                      La table EquipementList a un idEquipementList auto increment et un idItem auquel il est associé.

                      EquipmentList répertorie les possibles attributs des équipements.
                      Equipement est une table qui répertorie les équipements avec des attributs spéciaux.

                      Voici la structure, vous en pensez quoi ?


                      Image utilisateur

                      J'ai pas trop compris les n:n 1:n 1;1 etc donc regardez juste la structure pour me dire svp :)

                      Merci.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Structurer une BDD...Pas évident

                      × 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