IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Relation MCD, Article appartenant à des catégories et des sous-catégories


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Relation MCD, Article appartenant à des catégories et des sous-catégories
    Je travaille sur un MCD pour une BDD Mysql, où un article est classé par famille, sous-famille et sous-sous-famille.
    Donc il est logique de définir les tables suivantes :

    Article-(1,1)----(1,n)-ss_ss_famille-(1,1)----(1,n)-ss_famille-(1,1)----(1,n)-famille.

    Cependant parfois un article n'a pas 3 niveaux de classification mais seulement 2 voire 1 (juste une famille).
    Dans ce cas faut-il relier la table Article aux tables ss_famille et aussi famille ? Mais ensuite un article pourra appartenir à la fois à une famille A et une sous-famille B avec B n'étant pas forcément une sous-famille de A (donc incohérence des données).

    Quel est la meilleure solution ?

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Bonjour cestymour,


    En 1re approche, vous pouvez procéder à la généralisation de FAMILLE, SOUS_FAMILLE et SOUS_SOUS_FAMILLE pour mettre en œuvre une entité-type ENSEMBLE : une famille est un ensemble, une sous-famille est un ensemble, et une sous-sous-famille est un ensemble. Ceci fait, vous branchez ARTICLE sur ENSEMBLE.


    Vision MySQL Workbench :


    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour Fsmrel,


    Quel est l'intérêt d'une telle modélisation par rapport à une approche de gestion d'arbre ?

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Bonjour punkoff,


    L’arbre (la hiérarchie) est là, sauf qu’au lieu d’être bien vertical, il est couché... :





    Je répète, la généralisation vient se rajouter, en sorte qu'un article puisse se raccrocher à n'importe quel niveau.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Cette solution me convient très bien, fsmrel.

    Je comprends bien le principe de la relation EST-UN mais je ne vois pas ce que cela donne en langage SQL (et je n'ai pas réussi à créer ce genre de relation dans un diagramme MySQL Workbench)

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Pardon je me suis mal exprimé.


    Regroupons les familles / ss famille / ss-ss famille en une seule entité, puis ajoutons une relation sur elle même afin d'avoir une notion d'entité mère / fille et ainsi modéliser cet arbre.

    Ensuite il nous reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Article-1,1----Rattaché-----0,n-Super_Famille
     
    Super_Famille-0,n----------
    |                        |
    0,1                      |
    |------------Composée

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Pardon je me suis mal exprimé.


    Regroupons les familles / ss famille / ss-ss famille en une seule entité, puis ajoutons une relation sur elle même afin d'avoir une notion d'entité mère / fille et ainsi modéliser cet arbre.
    Dans ce type de schéma, je peux, (comme au départ) me retrouver avec des tas d'incohérences, car d'abord je perds la notion des 3 niveaux (ss-ss-f, ss-f, f), ensuite je peux me retrouver avec des boucles de familles, ou bien des familles (de niv 1) qui possèdent d'autre familles (de niv 1), etc...

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par cestymour Voir le message
    Je ne vois pas ce que cela donne en langage SQL (et je n'ai pas réussi à créer ce genre de relation dans un diagramme mySQL Workbench)
    Avez-vous lu ma prose au sujet de la modélisation avec MySQL Workbench ?

    En attendant, je joins le code SQL (brut) que l’outil m’a fourni et voyez le paragraphe 9 qui traite de la rétro-conception :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
     
    CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
    USE `mydb` ;
     
    -- -----------------------------------------------------
    -- Table `mydb`.`ENSEMBLE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `mydb`.`ENSEMBLE` (
      `EnsembleId` INT NOT NULL,
      `EnsembleNom` VARCHAR(45) NOT NULL,
      PRIMARY KEY (`EnsembleId`))
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `mydb`.`FAMILLE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `mydb`.`FAMILLE` (
      `FamilleId` INT NOT NULL,
      `EnsembleId` INT NOT NULL,
      INDEX `FAMILLE_ENSEMBLE_FK1_idx` (`EnsembleId` ASC),
      PRIMARY KEY (`FamilleId`),
      CONSTRAINT `FAMILLE_ENSEMBLE_FK1`
        FOREIGN KEY (`EnsembleId`)
        REFERENCES `mydb`.`ENSEMBLE` (`EnsembleId`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `mydb`.`ARTICLE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `mydb`.`ARTICLE` (
      `ArticleId` INT NOT NULL,
      `ArticleLibelle` VARCHAR(45) NOT NULL,
      `EnsembleId` INT NOT NULL,
      PRIMARY KEY (`ArticleId`),
      INDEX `ARTICLE_ENSEMBLE_FK_idx` (`EnsembleId` ASC),
      CONSTRAINT `ARTICLE_ENSEMBLE_FK`
        FOREIGN KEY (`EnsembleId`)
        REFERENCES `mydb`.`ENSEMBLE` (`EnsembleId`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `mydb`.`SOUS_FAMILLE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `mydb`.`SOUS_FAMILLE` (
      `FamilleId` INT NOT NULL,
      `SousFamilleId` INT NOT NULL,
      `EnsembleId` INT NOT NULL,
      PRIMARY KEY (`FamilleId`, `SousFamilleId`),
      INDEX `SOUS_FAMILLE_ENSEMBLE_FK1_idx` (`EnsembleId` ASC),
      CONSTRAINT `SOUS_FAMILLE_FAMILLE_FK1`
        FOREIGN KEY (`FamilleId`)
        REFERENCES `mydb`.`FAMILLE` (`FamilleId`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `SOUS_FAMILLE_ENSEMBLE_FK1`
        FOREIGN KEY (`EnsembleId`)
        REFERENCES `mydb`.`ENSEMBLE` (`EnsembleId`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `mydb`.`SOUS_SOUS_FAMILLE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `mydb`.`SOUS_SOUS_FAMILLE` (
      `FamilleId` INT NOT NULL,
      `SousFamilleId` INT NOT NULL,
      `SousSousFamilleId` VARCHAR(45) NOT NULL,
      `EnsembleId` INT NOT NULL,
      PRIMARY KEY (`FamilleId`, `SousFamilleId`, `SousSousFamilleId`),
      INDEX `SOUS_SOUS_FAMILLE_ENSEMBLE_FK1_idx` (`EnsembleId` ASC),
      CONSTRAINT `SOUS_SOUS_FAMILLE_SOUS_FAMILLE_FK1`
        FOREIGN KEY (`FamilleId` , `SousFamilleId`)
        REFERENCES `mydb`.`SOUS_FAMILLE` (`FamilleId` , `SousFamilleId`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `SOUS_SOUS_FAMILLE_ENSEMBLE_FK1`
        FOREIGN KEY (`EnsembleId`)
        REFERENCES `mydb`.`ENSEMBLE` (`EnsembleId`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
     
     
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

    Et n'oubliez pas de voter pour les réponses qui vous paraissent intéressantes et utiles (c'est la période )...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  9. #9
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Regroupons les familles / ss famille / ss-ss famille en une seule entité, puis ajoutons une relation sur elle même afin d'avoir une notion d'entité mère / fille et ainsi modéliser cet arbre.
    Il est certain que si le nombre de niveaux avait été flottant, quelconque, déséquilibré, alors comme vous le suggérez il aurait fallu passer à une réflexive, comme ici par exemple.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Avez-vous lu ma prose au sujet de la modélisation avec MySQL Workbench ?
    Non mais ça ne saurait tarder =p

    Avec le schéma proposé, est-ce qu'il y a une contrainte qui permette une sorte de ou exclusif afin qu'un ensemble soit : soit une famille, soit une sous-famille, soit une sous-sous famille ?
    Ou bien est-ce lors de l'utilisation de la BDD qu'il faut faire attention à ce qu'un ensemble ne corresponde qu'à une et une seule sorte de famille ?

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    vous pouvez utilisez un trigger pour émuler de telle contrainte. (before insert / update)

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Bonjour Fsmrel,


    Quel est l'intérêt d'une telle modélisation par rapport à une approche de gestion d'arbre ?
    N'oubliez pas non plus que MySQL est très en retard par rapport aux autres SGBDR puisqu'il ne supporte pas les requêtes récursives qui sont normalisée depuis 1999....
    Or les requêtes récursives sont indispsensables si l'on veut modéliser un arbre ou un graphe....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/08/2014, 19h24
  2. [AC-2007] créer des sous catégories dans un sous formulaire
    Par damlimoges dans le forum IHM
    Réponses: 2
    Dernier message: 12/06/2009, 08h31
  3. Réponses: 4
    Dernier message: 02/04/2008, 17h51
  4. Réponses: 3
    Dernier message: 13/09/2007, 18h11
  5. Réponses: 3
    Dernier message: 23/01/2007, 08h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo