Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 02/12/2010, 16h40   #1
Membre Expert
 
Avatar de prgasp77
 
Homme Yankel Scialom
Ingénieur en systèmes embarqués
Inscription : juin 2004
Messages : 811
Détails du profil
Informations personnelles :
Nom : Homme Yankel Scialom
Âge : 25
Localisation : France, Eure (Haute Normandie)

Informations professionnelles :
Activité : Ingénieur en systèmes embarqués
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juin 2004
Messages : 811
Points : 1 039
Points : 1 039
Par défaut Contrainte sur les attributs des tables référencées

Bonjour,
j'aimerais ajouter une contrainte un peu plus complexe que ce que je sais faire sur ma base. Je la simplifie en
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE A (
   idA int NOT NULL,
   plop int NOT NULL,
   PRIMARY KEY(idA)
);
CREATE TABLE B (
   idB int NOT NULL,
   plop int NOT NULL,
   PRIMARY KEY(idA)
);
CREATE TABLE Asso (
   idA int NOT NULL,
   idB int NOT NULL,
   PRIMARY KEY(idA,idB),
   FOREIGN KEY idA REFERENCES A(idA),
   FOREIGN KEY idB REFERENCES A(idB),
);
J'aimerais avoir une contrainte qui assure qu'une entrée dans la table Asso référence deux enregistrement dans A et B qui ont la même valeur pour l'attribut plop. Ainsi, pour chaque entrée dans Asso, "idA->plop=idB->plop" ... mais en SQL ^^

Merci beaucoup pour votre aide.
__________________
gasp in touch
-- Yankel Scialom
prgasp77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 16h53   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 635
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 635
Points : 2 627
Points : 2 627
Bonjour,


Si idA et idB doivent être systématiquement identique pourquoi faire 2 champs ?
(ou alors j'ai pas saisi la demande)
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 17h00   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 939
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 939
Points : 17 748
Points : 17 748
Vous avez donc un problème de conception, votre modèle physique viole la première forme normale.

Si vous aviez procédé à une modélisation conceptuelle avec un outil il vous aurait été impossible de concevoir vos entités ainsi !!!!

Pour résoudre votre problème, vous devez passer par un héritage. Lisez ceci :
http://sqlpro.developpez.com/cours/m...tion/heritage/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 17h28   #4
Membre Expert
 
Avatar de prgasp77
 
Homme Yankel Scialom
Ingénieur en systèmes embarqués
Inscription : juin 2004
Messages : 811
Détails du profil
Informations personnelles :
Nom : Homme Yankel Scialom
Âge : 25
Localisation : France, Eure (Haute Normandie)

Informations professionnelles :
Activité : Ingénieur en systèmes embarqués
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juin 2004
Messages : 811
Points : 1 039
Points : 1 039
Je vous trouve durs avec moi ... je n'ai évidemment pas une base de cette forme ou des tables de ces formes, j'ai simplifié le problème au maximum afin de vous aider à m'aider.

Qu'y a-t-il de si étrange ou de si non normalisé que de vouloir une contrainte sur des champs référencés dans une table d'association NxM ?

Merci.
__________________
gasp in touch
-- Yankel Scialom
prgasp77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 17h51   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 939
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 939
Points : 17 748
Points : 17 748
Citation:
Envoyé par prgasp77 Voir le message
Je vous trouve durs avec moi ...
Rassurez vous, il n'y a pas qu'avec vous que je le sui !!!!

Citation:
je n'ai évidemment pas une base de cette forme ou des tables de ces formes, j'ai simplifié le problème au maximum afin de vous aider à m'aider.
Visiblement si vous l'avez, mais comme vous ne modélisez pas au bon endroit, vous ne pouvez pas le voir... Pour médéliser correctement il faut faire un MODELEC CONCEPTUEL DE DONNÉES ou MCD. On ne peut pas modéliser correctement directement avec des tables !

Citation:
Qu'y a-t-il de si étrange ou de si non normalisé que de vouloir une contrainte sur des champs référencés dans une table d'association NxM ?

Merci.
Elle est stupide car un modèle bien fait n'a pas besoin d'une telle contrainte !!!

Voici la solution :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TABLE AB
   id int NOT NULL,
   plop int NOT NULL,
   PRIMARY KEY(id)
);
 
CREATE TABLE A (
   idA int NOT NULL FOREIGN KEY REFERENCES AB (id),
   PRIMARY KEY(idA)
);
CREATE TABLE B (
   idB int NOT NULL FOREIGN KEY REFERENCES AB (id),
   PRIMARY KEY(idA)
);
CREATE TABLE Asso (
   idA int NOT NULL,
   idB int NOT NULL,
   PRIMARY KEY(idA,idB),
   FOREIGN KEY idA REFERENCES A(idA),
   FOREIGN KEY idB REFERENCES A(idB),
);
Ainsi vous n'avez aucune redondance, donc aucun besoin de dire que plop = plop dans une contrainte!!!
Et si vous voulez des tables A et B avec votre plop en sus, il suffit de faire des vues :
Code :
1
2
3
4
5
6
CREATE VIEW V_A
AS
SELECT idA, plop
FROM   AB
       JOIN A
            ON ...
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/12/2010, 18h00   #6
Membre Expert
 
Avatar de prgasp77
 
Homme Yankel Scialom
Ingénieur en systèmes embarqués
Inscription : juin 2004
Messages : 811
Détails du profil
Informations personnelles :
Nom : Homme Yankel Scialom
Âge : 25
Localisation : France, Eure (Haute Normandie)

Informations professionnelles :
Activité : Ingénieur en systèmes embarqués
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juin 2004
Messages : 811
Points : 1 039
Points : 1 039
Très bien merci, je vérifie que cette solution attrayante soit compatible en tout point avec les outils que je vais utiliser. Je vous tiens au courant.

Edit : c'est tout bon, merci encore ... y'a plus qu'à apprendre à ma surcouche à gérer les vues "en écriture"
__________________
gasp in touch
-- Yankel Scialom
prgasp77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h27.


 
 
 
 
Partenaires

Hébergement Web