Partage
  • Partager sur Facebook
  • Partager sur Twitter

relations 1-n - n-n - n-1 avec MySQL

Sujet résolu
    8 novembre 2010 à 12:02:33

    Bonjour à tous.
    je viens vers vous car je ne sais pas comment configurer mon probleme, et surtout si j' ai utilisé la methode optimale.

    je possède deux tables principales

    CATEGORIES
    CREATE TABLE IF NOT EXISTS `categories` (
      `IDcat` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `categorie` varchar(50) NOT NULL,
      `refinage` tinyint(4) NOT NULL,
      `coefcat` decimal(10,2) unsigned NOT NULL,
      `trade` tinyint(1) NOT NULL DEFAULT '1',
      `origin` varchar(7) NOT NULL,
      PRIMARY KEY (`IDcat`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ;
    


    et

    ARTICLES
    CREATE TABLE IF NOT EXISTS `articles` (
      `IDart` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `ID_categorie` int(10) unsigned NOT NULL,
      `nom_refined` varchar(50) NOT NULL,
      `nom_unrefined` varchar(50) NOT NULL DEFAULT '-',
      `prix_unrefined` decimal(10,5) unsigned NOT NULL,
      `def_achat` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
      PRIMARY KEY (`IDart`),
      KEY `ID_categorie` (`ID_categorie`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=431 ;
    

    Contraintes pour la table `articles`
    ALTER TABLE `articles`
      ADD CONSTRAINT `articles_ibfk_1` FOREIGN KEY (`ID_categorie`) REFERENCES `categories` (`IDcat`) ON DELETE CASCADE ON UPDATE CASCADE;
    


    jusque la tout va bien,
    Je suis maintenant confronté à un probleme que je n' avais pas prévu ... je peux avoir 1 article qui correspond à 2 categories.
    cela me fait passer d'une relation 1-n à une relation n-n.

    Sachant que ce sont des articles qui rentrent dans les meme caracteristiques que les autres, je ne vois pas l'interet de creer une nouvelle table.

    Je pars donc dans l'idée de creer une table intermediaire de manière à avoir 1-n => n-n => n-1.
    mais comment redefinir les contraintes de clé etrangeres?
    puis-je laisser celle existante sur la table "articles" et en creer des nouvelles sur la table liaison?
    devrai-je modifier toutes mes requetes utilisant ces 2 tables (utilisation de la relation) ou y a t il y moyen de rentre cettetable transparente?

    merci de m' aiguiller car la je reflechi et sa fume lol :)
    • Partager sur Facebook
    • Partager sur Twitter
    Souvent la moitié de la réponse se trouve dans une question bien posée.
      8 novembre 2010 à 12:06:51

      Si un article peut appartenir à plusieurs catégories, la seule solution valable est la table de lien (relation n-n) qui contient id_article et id_categories, en FK sur les tables correspondantes. Et supprimer id_categorie de la table articles.

      Cela te demandera un peu de boulot au début, mais c'est beaucoup plus simple qu'une solution bricolée (d'ailleurs je n'ai pas bien compris ce que tu proposes...)
      • Partager sur Facebook
      • Partager sur Twitter
        8 novembre 2010 à 12:15:57

        merci pour ta reponse :)

        c'est bien la solution que je pensais

        ce que je proposais est simple (je pense lol)

        je voulais utiliser la methode que tu me decris pour ces nouveaux articles et pour la suite de mon projet, mais certaines requetes dont j' ai besoin que j' ai deja codé et que j'utilise n'utiliseront jamais ces nouveaux articles bi-categorie. je pensais donc que je pouvais continuer à les utiliser en "court-circuitant" la table relation (en gardant la colonne (ID_categorie)

        mais comme tu le stipule à la fin, ca risque de devenir une usine à gaz si toutes mes pages php ne sont pas codées dans la meme logique
        • Partager sur Facebook
        • Partager sur Twitter
        Souvent la moitié de la réponse se trouve dans une question bien posée.
          8 novembre 2010 à 12:42:30

          > mais comme tu le stipule à la fin, ca risque de devenir une
          > usine à gaz

          Oui, il faut éviter ce genre de truc : en plus si tu veux faire une requête qui mélange des articles "mono-catégorie" avec des articles "bi-catégorie", ce serait le cauchemar.
          • Partager sur Facebook
          • Partager sur Twitter

          relations 1-n - n-n - n-1 avec MySQL

          × 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