Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/05/2011, 21h51   #1
Invité de passage
 
Mohamed Belhadj
Inscription : juin 2010
Messages : 12
Détails du profil
Informations personnelles :
Nom : Mohamed Belhadj

Informations forums :
Inscription : juin 2010
Messages : 12
Points : 2
Points : 2
Par défaut Clés étrangères exclusives

Bonjour,

Je débute avec mysql et j'ai un petit problème avec les clés étrangères. j'ai les tables personnes physiques, personnes morales et biens. un bien doit être fourni soit par une personne physique soit par une personne morale. Il ne peut pas être fourni par les deux à la fois.

Mon problème c'est que après la modélisation du problème et la génération du code sql, j'ai deux contraintes de clé étrangère une avec les personnes physiques et autres avec les personnes morales et quand je veux remplir la table biens si je choisi l'id d'une personne physique comme fournisseur il affiche une erreur en me disant que la contrainte de clé étrangère sur la table personnes morales n'est pas satisfaite et vice versa.

Comment je peux faire pour dire que si une des contraintes est satisfaite l'autre peut ne pas l'être.
madmed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2011, 23h18   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 004
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 004
Points : 18 265
Points : 18 265
Envoyer un message via MSN à CinePhil
Il faut faire une généralisation des personnes et associer les biens aux personnes et pas aux personnes physiques ou aux personnes morales.

MCD :
personne_physique -(1,1)----Etre----0,1- personne -0,n----Fournir----1,1- bien
personne_morale -(1,1)----Etre----0,1----------|

Tables :
personne_prs (prs_id, prs_nom...)
personne_physique_pph (pph_id_personne, pph_prenom...)
personne_morale_pmr (pmr_id_personne, pmr_siret...)
bien_bin (bin_id, bin_id_fournisseur, bin_nom...)
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 00h21   #3
Invité de passage
 
Mohamed Belhadj
Inscription : juin 2010
Messages : 12
Détails du profil
Informations personnelles :
Nom : Mohamed Belhadj

Informations forums :
Inscription : juin 2010
Messages : 12
Points : 2
Points : 2
Citation:
Envoyé par CinePhil Voir le message
Il faut faire une généralisation des personnes et associer les biens aux personnes et pas aux personnes physiques ou aux personnes morales.

MCD :
personne_physique -(1,1)----Etre----0,1- personne -0,n----Fournir----1,1- bien
personne_morale -(1,1)----Etre----0,1----------|

Tables :
personne_prs (prs_id, prs_nom...)
personne_physique_pph (pph_id_personne, pph_prenom...)
personne_morale_pmr (pmr_id_personne, pmr_siret...)
bien_bin (bin_id, bin_id_fournisseur, bin_nom...)
c'est ce que j'ai fait dans le MCD mais j'ai choisit de ne pas générer le surtype personnes dans le MLD. maintenant si je garde les 3 tables prs pph et pmr sans dupliquer les attributs, je ne comprends pas comment je peux ajouter une nouvelle personne physique ou personne morale (je sens que cette question est débile )
madmed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 18h15   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 004
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 004
Points : 18 265
Points : 18 265
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par madmed Voir le message
c'est ce que j'ai fait dans le MCD mais j'ai choisit de ne pas générer le surtype personnes dans le MLD.
Ben faire l'héritage dans le MCD ne servait à rien alors !

Citation:
maintenant si je garde les 3 tables prs pph et pmr sans dupliquer les attributs, je ne comprends pas comment je peux ajouter une nouvelle personne physique ou personne morale (je sens que cette question est débile )
Avec ce mauvais SGBD qu'est MySQL, vu qu'il ne connait pas les triggers INSTEAD OF sur les vues, tu es obligé de créer d'abord la personne, de récupérer son ID puis de créer la personne morale ou physique.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 00h50   #5
Invité de passage
 
Mohamed Belhadj
Inscription : juin 2010
Messages : 12
Détails du profil
Informations personnelles :
Nom : Mohamed Belhadj

Informations forums :
Inscription : juin 2010
Messages : 12
Points : 2
Points : 2
Citation:
Envoyé par CinePhil Voir le message
Ben faire l'héritage dans le MCD ne servait à rien alors !


Avec ce mauvais SGBD qu'est MySQL, vu qu'il ne connait pas les triggers INSTEAD OF sur les vues, tu es obligé de créer d'abord la personne, de récupérer son ID puis de créer la personne morale ou physique.
Pouvez vous expliquez un peu plus svp. Sinon, est ce que les vues peuvent aider pour résoudre le problème http://dev.mysql.com/doc/refman/5.1/...atability.html ??
madmed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 08h42   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 004
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 004
Points : 18 265
Points : 18 265
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par madmed Voir le message
Sinon, est ce que les vues peuvent aider pour résoudre le problème http://dev.mysql.com/doc/refman/5.1/...atability.html ??
Les vues sont très utiles pour extraires les données et reconstituer l'intégralité des caractéristiques d'une personne, qu'elle soit morale ou physique.
Je reprends la structure que j'avais donnée :
Citation:
personne_prs (prs_id, prs_nom...)
personne_physique_pph (pph_id_personne, pph_prenom...)
personne_morale_pmr (pmr_id_personne, pmr_siret...)
bien_bin (bin_id, bin_id_fournisseur, bin_nom...)
Code :
1
2
3
4
5
CREATE VIEW v_personne_morale
SELECT p.prs_id, p.prs_nom, -- + autres colonnes de personne_prs
    m.pmr_siret -- + autres colonnes de personne_morale_pmr
FROM personne_prs p
INNER JOIN personne_morale_pmr m ON m.pmr_id_personne = p.prs_id
On s'en sert ensuite comme d'une table et on peut faire par exemple une jointure avec la table des biens :
Code :
1
2
3
4
SELECT b.bin_id, b.bin_nom AS nom_bien,
    m.prs_nom AS nom_fournisseur, m.pmr_siret AS siret_fournisseur
FROM bien_bin b
INNER JOIN v_personne_morale m ON m.prs_id = b.bin_id_fournisseur
Mais, comme le dit la doc :
Citation:
Some views are updatable.
C'est à dire pas toutes, et en fait très peu dans la pratique chez MySQL !

Citation:
For a view to be updatable, there must be a one-to-one relationship between the rows in the view and the rows in the underlying table.
Normalement, la structure en héritage que j'ai définie devrait rendre la vue que j'ai créée ci-dessus "updatable". C'est à essayer.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 09h45   #7
Invité de passage
 
Mohamed Belhadj
Inscription : juin 2010
Messages : 12
Détails du profil
Informations personnelles :
Nom : Mohamed Belhadj

Informations forums :
Inscription : juin 2010
Messages : 12
Points : 2
Points : 2
OK je vais essayer, merci beaucoup.
madmed est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h09.


 
 
 
 
Partenaires

Hébergement Web