|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Architecte de système d'information Inscription : octobre 2011 Messages : 3 ![]() |
Bonjour,
Je modelise une application de gestion des annonces dans une localité bien définie. L'annonce n'est pas categorisée et donc concerne tout type d'annonce que l'utilisateur pourra décider de publier. (Auto, Moto, Immobilier, Bijoux, Informatique, Electronique....). Voici quelques grandes lignes sur lesquelles je me suis butté. 1. Un Utilisateur peut mettre Une ou Plusieurs Annonce. 2. Une Annonce concerne Un et Un-Seul Produit a la fois. 3. A chaque produit est lié une seule Catégorie(Auto,Moto,Immobilier...) Ce qui peut se modéliser par: Utilisateur (0,n) -------------- (1,1) Annonce (1,1) ----------- (1,1) Produit Produit (1,1) ----------------- (0,n) Categorie. Alors dans une annonce non categorisée au depart, toute catégorie d'objet peut faire l'objet d'une annonce. Dans la relation : Produit (1,1) ----------------- (0,n) Categorie, on voit bien qu'il faut différencier les catégories. Par exemple une Auto a pour caracteristique le Type de Carburant (Diesel, Hybride, Essence, Gasoil), le Nombre de Chevaux, le Nombre de Cylindre.... alors que pour un Immobilier on a par exemple : le Type (Maison, Appartement, Chambre, Studio...). Au regard de tout ceci, on convient donc qu'on ne peut pas a priori se contenter d'une seul entité pour contenir nos différentes catégories. Car il serait fastidieux de devoir gerer toutes les caracteristiques sur un seul tuplet. Il est donc imperatif, pour chacune des Catégories, de créer une entité qui lui est propre avec ses caracteristiques. Mais la encore il y a un probleme. Si l'application est en production et que l'on décide d'ajouter une catégorie, il va falloir lui créer une entité dans la base de données et également créer son formulaire... ca complique les choses.Donc pour tenter de résoudre ce probleme de facon plus simple et souple, j'ai pensé a faire de l'héritage mais alors comment représenter l'héritage avec MySQL Workbench ? Ou alors, si quelqu'un a deja travaillé sur un projet similaire, comment l'a t-il abordé ? et comment a t-il résolu le probleme ? Merci. |
|
|
00
|
|
|
#2 |
![]() ![]() |
Il y a déjà eu des cas similaires de traités sur ce forum.
Sur le principe de l'héritage de données, voir l'article de SQLPro. MCD : A -(1,1)----hériter_de----0,1- B Tables : B (B_id, [colonnes communes à tous les B]) A (A_id_B, [colonnes spécifiques à A])
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
|
00
|
|
|
#3 |
|
Invité de passage
![]() Architecte de système d'information Inscription : octobre 2011 Messages : 3 ![]() |
Bonjour @CinePhi,
Merci pour ta reponse. En suivant le lien que tu as donne ci-dessus, je suis tombe sur l'approche de l'heritage conditionnel, je crois que c'est le cas qui me convient le plus dans cette situation. Mais si je souhaite un heritage conditionnel avec Ajout de Colonne dans la table Mere (Categorie dans mon cas). Cf. image attachee ci-dessous. Comment est ce que je pourrai ecrire les TRIGGERS pour differencier les differentes categories pendant l'insertion ? |
|
|
00
|
|
|
#4 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() François de Sainte MarieSpécialiste en bases de données Inscription : septembre 2006 Messages : 3 637 ![]() |
Bonsoir gkant,
Reprenons votre diagramme : Vous n’avez sans doute pas fait attention à la nature des associations entre les types d’entités (tables dans le cas de MySQL Workbench). Littéralement on vous lit ainsi : Une catégorieAlors qu’il faut lire : Un véhicule est une auto ou une moto ;La représentation attendue est la suivante, par exemple pour les relations entre VEHICULE et ses sous-types : A cet effet, la relation entre le surtype VEHICULE et le sous-type AUTO passe par la mise en œuvre d’une relation identifiante (Identifying relationship) 1:1 : Et pour signifier que seuls certains véhicules sont des autos, on remplace 1 par 0,1 côté AUTO comme ci-dessus. Pour cela, on double-clique sur le lien entre VEHICULE et AUTO pour faire apparaître l’onglet qui va bien (« Foreign key ») ;il ne reste plus qu’à décocher la case « Mandatory » : Citation:
La notion de catégorie fait double emploi avec l’héritage, à mon sens elle peut disparaître. On a des produits qui se déclinent en véhicules, logements, etc. : Si l’utilisateur (au sens large) s’intéresse aux motos, vous pouvez définir une vue à cet effet, qui soit la jointure sur ProduitId des tables PRODUIT, VEHICULE, MOTO et il aura ainsi accès de façon simple à l’ensemble des composants (logés à tous les étages...) d’une moto en particulier (et sans le nombre de portes !) Tout dépend du SGBD. Si vous utilisez MS SQL SERVER je pourrai vous aider, sinon il vous faudra aller à la pêche dans les forums dédiés.
__________________
_ 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 ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
|
10
|
|
|
#5 | |||||||||||||
|
Expert Confirmé Sénior
![]() ![]() ![]() François de Sainte MarieSpécialiste en bases de données Inscription : septembre 2006 Messages : 3 637 ![]() |
En complément :
Citation:
Code SQL :
Supposons que vous vouliez créer les données pour une automobile. Il y a 3 tables à mettre à jour : PRODUIT, VEHICULE et AUTOMOBILE. Pour vous épargner de la peine, vous pouvez directement mettre à jour la vue VOITURE ainsi définie : Code SQL :
Mais à ce jour, quasiment tous les SGBD répugnent — à tort ! — à mettre à jour une vue qui comporte des jointures : on est donc obligé de mettre en œuvre des triggers associés à la vue pour que les choses se passent bien. Un trigger (MS SQL Server en l’occurrence) pour insérer les données d’une voiture (ou plusieurs) : Code SQL :
Un trigger pour modifier les données d’une voiture (ou plusieurs) : Code SQL :
Un trigger pour supprimer une voiture (ou plusieurs) : Code SQL :
Dans tout cela, le trigger pour exclusion devient inutile. Dans ce genre de contexte, il est préférable d’interdire les mises à jour directes des tables, donc de supprimer les droits correspondants et n’autoriser que la mise à jour de la « table » VOITURE (même principe pour les motos, les appartements, etc.) Un début de jeu d’essai (toujours MS SQL Server) : Code SQL :
Si par hasard vous utilisiez MySQL, la technique utilisée poserait un problème, car je crois savoir qu'il refuse les triggers associés aux vues...
__________________
_ 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 ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|||||||||||||
|
|
30
|
Copyright © 2000-2013 - www.developpez.com