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

  1. #1
    Membre régulier
    Comment modéliser cette table de statistiques simple ?
    Bonjour,

    Je n'arrive pas à faire un choix pour modéliser la problématique suivante : faire des statistiques sur le nombre d'objets déduits ou stockés par année, mois, jour et par catégorie et sous-catégorie... L'unité de temps n'est pas déterminée, donc les possibilités doivent être assez large.

    J'ai des catégories d'objets, qui peuvent posséder une sous-catégorie. Les sous-catégorie ne peuvent appartenir qu'à une catégorie.
    ex:
    - catégorie : outils
    -> sous-catégorie : jardinage
    -> sous-catégorie : maçonnerie

    - catégorie : visserie (pas de sous catégorie).

    Pour chaque catégorie et sous-catégorie, ont lance des cycles de destruction ou stockage et à la suite de ce cycle ont doit enregistrer en base le nombres d'objets qui ont été détruit et le nombre d'objets qui ont été stocké.
    J'arrive au MCD suivant que j'ai simplifié en supprimant les associations :


    A chaque cycle de comptage, j'ajoute une nouvelle ligne dans la table "Categorie" de l'objet avec la date du comptage et le nombre de destructions et le nombre de stockages. Si cet objet possède une sous-catégorie, j'ajoute une ligne équivalente dans la table "Sous-categorie".

    Est-ce que ce modèle est correct pour ce besoin ?
    J'ai hésité à modéliser un héritage mais pour simplifier l'implémentation en java, j'ai préférer dupliquer les attributs dateComptage, nbDestruction et nbStockage. Est-ce que c'est judicieux ?
    Il y avait aussi la possibilité de lier la table "Comptage Catégorie" à la table "Comptage Sous-catégorie". Mais dans ce cas, la table "Comptage Sous-catégorie" possède deux clés étrangères : idComptageDomaine et idSousCategorie.

    Est-ce qu'il y a une meilleur solution à ce problème ? Ou bien encore est-ce que je me trompe complètement ? et dans ce cas j'aimerai bien un petit coup de pouce svp.

    Merci d'avance et à bientôt.

  2. #2
    Membre éclairé
    Bonsoir,
    Citation Envoyé par DavidleVrai Voir le message
    J'arrive au MCD suivant que j'ai simplifié en supprimant les associations
    Tout d'abord, votre modèle n'est pas un MCD simplifié mais un mélange entre un MCD et un MLD.
    En effet, un MCD ne fait jamais apparaître les clés étrangères qui sont le résultat des cardinalités.
    Quel logiciel avez-vous utilisé pour obtenir ce résultat hybride ?

    Est-ce qu'il y a une meilleur solution à ce problème ? Ou bien encore est-ce que je me trompe complètement ? et dans ce cas j'aimerai bien un petit coup de pouce svp.
    Je pense que vos 2 tables de comptage sont une mauvaise idée : en effet, il sera difficile de gérer les résultats issus de catégories avec ou sans sous-catégories.
    La solution qui consiste à associer Catégorie à Comptage est envisageable, mais elle impose que vous vous assuriez que ce lien ne soit possible que si la catégorie n'a pas de sous-catégories...
    Avec le logiciel Looping, cela pourrait donner le modèle suivant :

    Une autre solution qui serait beaucoup plus simple à gérer consiste à considérer qu'une catégorie possède au moins une sous-catégorie (ex: Catégorie : visserie - Sous-catégorie : visserie).
    Et là tout devient facile : "ConcernerC" disparait, le 0,1 devient 1,1 et votre application de comptage s'en trouvera largement simplifiée.
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  3. #3
    Expert éminent sénior
    Bonsoir,


    Citation Envoyé par DavidleVrai Voir le message
    J'ai hésité à modéliser un héritage mais pour simplifier l'implémentation en java, j'ai préférer dupliquer les attributs dateComptage, nbDestruction et nbStockage. Est-ce que c'est judicieux ?


    Java sait ce qu’est un MCD ou un diagramme de classe ?

    Sinon, allez-y pour l’héritage :


    Code SQL :

    CREATE TABLE X_CAT
    (
       xCatId INT,
       xCatLibelle VARCHAR(48) NOT NULL,
       CONSTRAINT X_CAT_PK PRIMARY KEY(xCatId)
    );
    
    CREATE TABLE CATEGORIE
    (
       xCatId INT,
       CONSTRAINT CATEGORIE_PK PRIMARY KEY(xCatId),
       CONSTRAINT CATEGORIE_X_CAT_FK FOREIGN KEY(xCatId) 
           REFERENCES X_CAT(xCatId)
           ON DELETE CASCADE
    );
    
    CREATE TABLE SOUS_CATEGORIE
    (
       xCatId_1 INT,
       xCatId INT NOT NULL,
       CONSTRAINT SOUS_CATEGORIE_PK PRIMARY KEY(xCatId_1),
       CONSTRAINT SOUS_CATEGORIE_X_CAT_1_FK FOREIGN KEY(xCatId_1) 
           REFERENCES X_CAT(xCatId)
           ON DELETE CASCADE,
       CONSTRAINT SOUS_CATEGORIE_CATEGORIE_FK FOREIGN KEY(xCatId) 
           REFERENCES CATEGORIE(xCatId)
    );
    
    CREATE TABLE COMPTAGE
    (
       comptageId INT,
       comptageDate DATE NOT NULL,
       nbDestructions INT NOT NULL,
       nbStockages INT NOT NULL,
       xCatId INT NOT NULL,
       CONSTRAINT COMPTAGE_PK PRIMARY KEY(comptageId),
       CONSTRAINT COMPTAGE_X_CAT_FK FOREIGN KEY(xCatId) 
           REFERENCES X_CAT(xCatId)
    );

    Si l'héritage ne vous convient toujours pas, suivez Paprick…
    Faites simple, mais pas plus simple ! (A. Einstein)
    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 »)

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

  4. #4
    Membre régulier
    Bonjour et merci pour vos deux réponses qui me donnent les deux approches que je cherchais. Avant de faire un choix j'essaye de comprendre les avantages et inconvénients de chacun d'eux.

    Citation Envoyé par Paprick Voir le message
    Tout d'abord, votre modèle n'est pas un MCD simplifié mais un mélange entre un MCD et un MLD.
    En effet, un MCD ne fait jamais apparaître les clés étrangères qui sont le résultat des cardinalités.
    Quel logiciel avez-vous utilisé pour obtenir ce résultat hybride ?
    J'ai fait un diagramme de classe à la place de faire un MCD avec la version en ligne de Visual Paradigm. Mais, vous l'aurez compris, les modélisations de bases de données ne sont pas ma spécialité.

    Citation Envoyé par Paprick Voir le message
    Une autre solution qui serait beaucoup plus simple à gérer consiste à considérer qu'une catégorie possède au moins une sous-catégorie (ex: Catégorie : visserie - Sous-catégorie : visserie).
    Et là tout devient facile : "ConcernerC" disparait, le 0,1 devient 1,1 et votre application de comptage s'en trouvera largement simplifiée.
    J'aurai bien aimé mais il existe déjà beaucoup de données en base qui suivent ce modèle et ce serait très long de tout refaire.

    Citation Envoyé par Paprick Voir le message
    Je pense que vos 2 tables de comptage sont une mauvaise idée : en effet, il sera difficile de gérer les résultats issus de catégories avec ou sans sous-catégories.
    La solution qui consiste à associer Catégorie à Comptage est envisageable, mais elle impose que vous vous assuriez que ce lien ne soit possible que si la catégorie n'a pas de sous-catégories...
    Avec le logiciel Looping, cela pourrait donner le modèle suivant :
    Pièce jointe 571438
    Si j'ai bien compris, le code pour réaliser ce modèle en SQL peut être le suivant (J'ai aussi fait l'ajout des catégories et sous-catégories) :
    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
    CREATE TABLE CATEGORIE
    (
       id int,
       libelle VARCHAR(50) NOT NULL,
       CONSTRAINT CATEGORIE_PK PRIMARY KEY(id)
    );
     
    CREATE TABLE SOUS_CATEGORIE
    (
       id INT,
       idCategorie INT NOT NULL,
       libelle VARCHAR(50) NOT NULL,
       CONSTRAINT SOUS_CATEGORIE_PK PRIMARY KEY(id),
       CONSTRAINT SOUS_CATEGORIE_CATEGORIE_FK FOREIGN KEY(idCategorie) 
           REFERENCES CATEGORIE(id)
    );
     
    CREATE TABLE COMPTAGE
    (
       id INT,
       idCategorie,
       idSousCategorie,
       dateComptage DATE NOT NULL,
       nbDestructions INT NOT NULL,
       nbStockages INT NOT NULL,
       CONSTRAINT COMPTAGE_PK PRIMARY KEY(id),
       CONSTRAINT COMPTAGE_CATEGORIE_FK FOREIGN KEY(idCategorie) 
           REFERENCES CATEGORIE(id),
       CONSTRAINT COMPTAGE_SOUS_CATEGORIE_FK FOREIGN KEY(idSousCategorie) 
           REFERENCES SOUS_CATEGORIE(id)
    );
     
    INSERT INTO CATEGORIE VALUES (1, 'outillage');
    INSERT INTO CATEGORIE VALUES (2, 'visserie');
     
    INSERT INTO SOUS_CATEGORIE VALUES (1, 1, 'jardinage');
    INSERT INTO SOUS_CATEGORIE VALUES (2, 1, 'maconnerie');


    Existe-il une solution en SQL pour gérer l'exclusion CATEGORIE/SOUS_CATEGORIE ?

    Si on veut respecter cette exclusion les insertion de comptage doivent se faire de la manière suivante ?
    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO COMPTAGE VALUES (1, null, 1, '20200612 01:23:09 PM', 10, 100);
    INSERT INTO COMPTAGE VALUES (2, null, 2, '20200612 01:30:00 PM', 0, 50);
    INSERT INTO COMPTAGE VALUES (3, 2, null, '20200612 01:40:00 PM', 1000, 10000);

    Si c'est bien la cas, faire la somme pour les catégories va demander de faire la somme des comptages des catégories et des comptages des sous-catégorie par catégorie. Ce qui n'est pas intuitif.

    On aurait plus tendance à faire de la manière suivante :
    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO COMPTAGE VALUES (1, 1, 1, '20200612 01:23:09 PM', 10, 100);
    INSERT INTO COMPTAGE VALUES (2, 1, 2, '20200612 01:30:00 PM', 0, 50);
    INSERT INTO COMPTAGE VALUES (3, 2, null, '20200612 01:40:00 PM', 1000, 10000);

    Et de cette manière faire seulement la somme des catégorie ou la somme des sous-catégories pour obtenir la même chose que précédemment.

    Citation Envoyé par fsmrel Voir le message
    Java sait ce qu’est un MCD ou un diagramme de classe ?
    fmsrel, c'est vrai que la tournure de ma phrase est un peu hasardeuse et je comprend la remarque.

    Peut etre que je me trompe mais de mémoire faire le mapping de tables simulant un héritage avec Hibernate se fait moins facilement que pour des modèles plus simples. Et ca m'arrangerai d'utiliser ce framework.

    Malheureusement je ne suis pas le seul à être sur le sujet et il faut savoir faire des compromis. Mais d'avoir tous les comptes dans une table commune est un avantage non négligeable mais je ne maîtrisé pas assez les BdD pour juste avec les modèles être capable d'identifier tous les avantages et inconvénient de chacune des solutions.

  5. #5
    Membre régulier
    Bonjour,

    Finalement la réponse à ma question de mettre à null ou non la clé étrangère si la sous-catégorie existe était donnée par Patrick. Je n'avais pas fait attention, excusez-moi, mais ça aurait peut-être été bien de votre part de m'en informer.
    Citation Envoyé par Paprick Voir le message
    La solution qui consiste à associer Catégorie à Comptage est envisageable, mais elle impose que vous vous assuriez que ce lien ne soit possible que si la catégorie n'a pas de sous-catégories...
    Mais au final la meilleurs solution dans mon cas est peut être autre que celles proposées.

    En m'inspirant de la proposition de Patrick :
    Citation Envoyé par Paprick Voir le message
    Une autre solution qui serait beaucoup plus simple à gérer consiste à considérer qu'une catégorie possède au moins une sous-catégorie (ex: Catégorie : visserie - Sous-catégorie : visserie).
    Et là tout devient facile : "ConcernerC" disparait, le 0,1 devient 1,1 et votre application de comptage s'en trouvera largement simplifiée.
    La solution est d'ajouter une sous-catégorie "Aucune". Et dans ce cas la relation "Appartenir" devient 1,n - 1,1 et "Concerner" 0,n - 1,1.
    Cela peut paraître être un détail mais de partir sur une sous-catégorie "Aucune" à la place d'une sous-catégorie identique à la catégorie me permet de faire facilement avec ce qui existe actuellement.

    Que pensez-vous de cette solution ?

    Et merci pour le conseil d'utiliser ton logiciel Looping Patrick. Il fait très bien ce qu'on lui demande et ne possède pas de fonctionnalités superflues comme beaucoup d'usines à gaz du commerce. Encore merci !

    A plus tard sur developpez.

  6. #6
    Membre éclairé
    Bonsoir,
    Citation Envoyé par DavidleVrai Voir le message
    La solution est d'ajouter une sous-catégorie "Aucune". Et dans ce cas la relation "Appartenir" devient 1,n - 1,1 et "Concerner" 0,n - 1,1.
    Cela peut paraître être un détail mais de partir sur une sous-catégorie "Aucune" à la place d'une sous-catégorie identique à la catégorie me permet de faire facilement avec ce qui existe actuellement.
    Au niveau modélisation conceptuelle, l'important est qu'une catégorie possède au moins une sous-catégorie : le nom que vous lui donnez est effectivement à votre convenance.
    Le MCD devient alors très simple, et l'application qui en découlera le sera tout autant :

    Bonne continuation !
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  7. #7
    Membre régulier
    Bonjour,

    Oui tout fonctionnera bien mieux.

    Merci pour votre aide.