[MCD] multiples catégories de produits

multiples catégories de produits [MCD] - SQL/NoSQL - Programmation

Marsh Posté le 03-12-2009 à 14:40:24    

Bonjour à tous,
 
Dans le cadre d'un stage je dois créer une base données pour un traiteur en ligne, malheureusement mon expérience sur les bases de données est plus que réduite :(
 
J'ai eu des cours assez simples sur le MCD et le MPD, pas de notions d'héritage ni de trucs compliqués, bref le minimum. Alors maintenant je galère un peu...
 
Donc pour ce MCD j'ai une table 'PRODUITS' qui contient le stock actuel du dit produit et son libellé (juste le nom, la description du produit se fait ailleurs). Mais ce produit peut être de nature différente (et donc traité de façon différente par la suite). Pour renseigner son état j'ai donc sous-divisé ma table 'PRODUITS' vers des tables de catégories qui sont : 'BOISSONS', 'INGREDIENTS', 'PLATS', 'MATERIELS', 'VINS' (je sais que 'vins' devrait être dans 'boissons', mais il y a trop de références, on ne pourrait pas s'y retrouver ensuite).
 
http://i68.photobucket.com/albums/i7/Anatal/MCD_cat_prod.jpg
 
Même si ça fait beaucoup de tables j'étais plutôt content de moi, malheureusement quand je passe au MPD ça ne fonctionne pas du tout comme je l'aurais souhaité. Je me retrouve avec une FK par sous-catégorie dans ma table 'PRODUITS' ce qui ne peut pas fonctionner correctement.
 
http://i68.photobucket.com/albums/i7/Anatal/MPD_cat_prod.jpg
 
Je voulais donc savoir si quelqu'un avait une idée (à part bidouiller les cardinalités pour que enlever les FK de ma table 'produits' :mrgreen: ) ? Quitte a remodeler entièrement mon MCD, je préfère le refaire pour qu'il soit conforme par la suite.
 
Si vous voulez jeter un coup d'oeil au MCD complet pour avoir une vue d'ensemble, voici un lien pour télécharger le zip :
MCD Complet (Line 1 de la partie "Le MCD complet" )
 
Je pourrais très bien regrouper toutes mes catégories dans ma table 'PRODUITS' grâce au système des 'id_parent' et 'id_fils' (voir explication ci-dessous) mais si c'était possible j'aimerais bien bien garder un table par catégorie.
 
Le système des 'id_parent' et des 'id_fils' est simples et pratique mais je ne suis pas sur qu'il soit très conforme à l'esprit BDD. Je m'explique:
 
'id_parent' est une référence à la catégorie supérieure du produit en question, et 'id_fils' est la référence est la sous-catégorie inférieure. Par exemple pour la table 'INGREDIENTS' cela donne:
 
http://i68.photobucket.com/albums/i7/Anatal/id_parent.jpg
 
C'est pratique pour le classement, pour les requêtes c'est assez simple d'avoir l'arborescence pour un produit donné. Seulement avec cette technique dans une table sensée ne contenir que des produits je me retrouve avec de catégories et des sous-catégories, bref des choses immatérielles que mon patron serait bien en peine de servir à la table d'un client.
 
Est-ce que pour vous cette technique est choquante? Si oui j'ai un soucis, vu que je pensais en cas de non-résolution de mon problème de MPD fusionner toutes les tables de catégories avec la table 'PRODUITS' qui du coup ne poserait plus de problème de cardinalités mais qui contiendrait un nom impressionnant de catégories, de sous-catégories, de sous-sous-catégories, etc...  
 
Bref elle deviendrait illisible pour l'oeil humain.
 
Quand pensez vous? Quelle solution adopteriez-vous?


Message édité par SV_LVH le 03-12-2009 à 18:51:39

---------------
Quand vous demandez sur un forum comment changer un pneu de voiture peu de gens vous répondent. Et ceux qui le font vous expliquent généralement comment rouler sur 3 roues.
Reply

Marsh Posté le 03-12-2009 à 14:40:24   

Reply

Marsh Posté le 03-12-2009 à 15:14:17    

Salut,
 
Les liens de ton post ne fonctionnent pas, tu devrais l'éditer :o
 
Pour ton arborescence (la dernière image), le plus simple amha vu que tu souhaites une arborescence à plusieurs niveaux est d'avoir deux tables :
 
- une avec la liste des "ingrédients"
- la seconde avec juste deux champs : id ingrédient père et id ingrédient fils
 
Parce qu'avec ton système, on voit que le père de 15 est 14, mais on ne peut pas faire le lien à partir de 14...

Reply

Marsh Posté le 03-12-2009 à 15:20:10    

Voilà j'ai changé les liens morts pour mettre directement les images, ça doit fonctionner maintenant.


---------------
Quand vous demandez sur un forum comment changer un pneu de voiture peu de gens vous répondent. Et ceux qui le font vous expliquent généralement comment rouler sur 3 roues.
Reply

Marsh Posté le 03-12-2009 à 15:30:01    

Thx, c'est mieux [:bien]
 
Sinon, pour ton autre problème, plutôt que d'avoir 6 champs dont 5 seront toujours à NULL, j'emploierais la méthode suivante, qui est très certainement BEAUCOUP moins propre mais sera plus simple niveau traitement :
 
Tu oublies la table Produits et les tables associées, pour =>
 
- une table Produits avec id, libellé, définition, et les champs spécifiques aux vins (qui ne serviront pas pour tous les enregistrements)
- une table pour la hiérarchie (id produit père, id produit fils)
 
Pour les millésimes, vire le millésime de la table des vins : sinon tu auras plusieurs fois le même vin dans la table des produits. Mets juste une table Millésime avec id du vin, année et note (pas besoin d'une table qui répertorie les années, amha ça n'apporte rien).
 
Je ne comprends pas trop l'intérêt de la hiérarchie des produits, mébon tu dois mieux savoir que moi à quoi ça sert :o

Reply

Marsh Posté le 03-12-2009 à 16:18:14    

Je ne comprends pas trop l'intérêt de la hiérarchie des produits, mébon tu dois mieux savoir que moi à quoi ça sert
 
La hiérarchie des produits c'est pour le classement plus tard quand il y aura un page web par produit, ça sera plus simple de savoir dans quelle rubrique les ranger.
 
Tu oublies la table Produits et les tables associées, pour =>
- une table Produits avec id, libellé, définition, et les champs spécifiques aux vins (qui ne serviront pas pour tous les enregistrements)
- une table pour la hiérarchie (id produit père, id produit fils)

 
C'est ce que je proposais en disant que je pensais fusionner toutes mes tables de catégories avec ma table 'produit'. Je crois que je vais faire un essai avec cette technique.
 
Mets juste une table Millésime avec id du vin, année et note (pas besoin d'une table qui répertorie les années, amha ça n'apporte rien).
 
C'est justement une table avec les millésimes par type de vin que je veux faire : une table pour les bordeaux rouges, une tables pour les blancs d'Alsace, etc...  Surtout pas pour donner une note directement à un vin bien précis.


---------------
Quand vous demandez sur un forum comment changer un pneu de voiture peu de gens vous répondent. Et ceux qui le font vous expliquent généralement comment rouler sur 3 roues.
Reply

Marsh Posté le 03-12-2009 à 16:59:19    

Dans ce cas, tu as un truc qui est encore au-dessus de ton vin : sa catégorie :o

Reply

Marsh Posté le 03-12-2009 à 19:04:55    

Donc après modification... je me retrouve avec le même soucis. Je n'ai fait que déplacer le problème en fait, cela n'a servi à rien. Je dois avoir un défaut de conception, une chose que je n'ai pas compris.
 
Voilà le résultat après modification de mon MCD :
http://i68.photobucket.com/albums/i7/Anatal/mcd_modif.jpg
 
et le résultat identique sur mon MPD:
http://i68.photobucket.com/albums/i7/Anatal/mpd_modif.jpg
 
Si vous voyez ce qui cloche dans la conception de ma modélisation je serais heureux de vous entendre, parce que là je craque.  :fou:


Message édité par SV_LVH le 03-12-2009 à 19:06:52

---------------
Quand vous demandez sur un forum comment changer un pneu de voiture peu de gens vous répondent. Et ceux qui le font vous expliquent généralement comment rouler sur 3 roues.
Reply

Marsh Posté le 03-12-2009 à 20:44:59    

Bonsoir,
 
Je ne vois pas beaucoup de possibilités à ta question :  
La première, c'est ce que tu proposes dans ton premier MCD, et en effet ça fait beaucoup de clés vides pour un produit (à moins que des règles de gestion t'obligent à remplir ces champs)
La seconde est une table "vrac", qui aurait 3 champs fonctionnels :  
id_produit, id_catégorie, valeur, comme ça si un produit ne possède pas cette catégorie, il n'y a pas de ligne qui se crée
La troisième serait de remplacer toutes tes relations 1,1 -> 0,N par une relation 0,N -> 0,N comme tu as fait pour ta relation Produit <-> Région. Tu aurais donc des attributs à cette relation, par exemple entre Produit et Unité, tu peux imaginer mettre la quantité  
(exemple : le produit 1 nécessite 3 cuillère à soupe, :  
id_produit, id_unité, quantité :
1, 5 (ici l'unité cuillère à soupe = 5), 3
et tu peux aussi stocker la quantité en grammes :  
1, 2, 20)
Pour résumer, si tu laisses tes relations 1,1 -> 0,N, la PK de la table du côté du 1,1 deviendra obligatoirement FK de la table 0,N
 
Bon courage,
 
Petit PS : en relisant ton premier post, tu écris "vin devrait être dans boisson mais ... trop dur de s'y retrouver"; n'oublie surtout pas que ta base de données est une structure, pas une interface. Si tu veux faire un filtre dans la table Boisson, tu mets un type, une table de valeur "type de boisson", et tu auras : type 1 = vin, 2 = bière..., un index, et avec des requêtes tu as filtré ta table. Il ne faut pas se poser de contraintes sur ces critères la, tu en auras déjà assez avec la réalisation d'un modèle fonctionnel, ouvert mais pas trop, compréhensible, évolutif etc. (je suppose que tu n'as pas non plus des dizaines voire des centaines de millions de boissons à gérer, et même dans ce cas, ça reste largement accessible si ton modèle est bien pensé).


Message édité par Tibar le 03-12-2009 à 20:52:57
Reply

Marsh Posté le 03-12-2009 à 22:53:55    

Ok merci pour tes conseils Tibar, je crois bien que tu as raison (je parle du p.s. de ton message).
 
J'ai apporté quelques modifications à mon mcd et maintenant  ça à l'air de rouler!  :)  
 
Voici la dernière image de mon MCD, le MPD est correct :
 
http://i68.photobucket.com/albums/i7/Anatal/produit.jpg
 
Biensûr mon MCD est pas fini il me reste quelques bricoles a retoucher mais je crois que je tiens le bon bout cette fois.


---------------
Quand vous demandez sur un forum comment changer un pneu de voiture peu de gens vous répondent. Et ceux qui le font vous expliquent généralement comment rouler sur 3 roues.
Reply

Marsh Posté le 03-12-2009 à 23:43:56    

Cool, bon courage pour la suite des évènements...
N'hésite pas poser des questions si tu te retrouves dans une impasse, il n'y a pas de problème, que des solutions...

Reply

Marsh Posté le 03-12-2009 à 23:43:56   

Reply

Marsh Posté le 04-12-2009 à 13:23:53    

Tu devrais t'inspirer du MCD du produit GPL Magento (boutique en ligne). T'as une table produits avec qq champs communs à tous les produits et ensuite des liens vers des tables de champs personnalisés (une table par type de champ, une table pour les champs int, une pour les strings...)
 
Sinon, en plus simple comme mcd, y'a celui d'Icare (cf ma signature). C'est le même principe mais y'a pas une table par type de champ perso.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed