IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Développement SQL Server Discussion :

Problème de relations et on delete


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut Problème de relations et on delete
    Bonjour,
    Admettons le schéma suivant :

    Entre Table1 et Table2 la relation indique "on delete cascade"
    Entre Table1 et Table3 la relation indique "on delete cascade"
    Entre Table3 et Table2 la relation indique "on delete set NULL"

    En ben ça, mssql ne le tolère pas. Apparemment il considère que si on supprime un item de Table1, les ligne correspondantes à Table3 dans Table2 ne pourront plus être mises à jour (NULL sur IDTable3) par la suppression des items dans Table3 via la contrainte entre Table1 et Table3.

    J'ai réalisé exactement le même schéma sur MySql et là, c'est OK.
    Il me semblerais qu'une contrainte delete cascade soit prioritaire sur une contrainte delete set null.
    D'autre part, si l'on supprime un item de Table1, tant les items correspondants dans Table3 que ceux dans Table2 disparaitront. Donc la contrainte delete set null devient caduque dans ce cas...

    Qu'est-ce que vous en pensez ???

    Ou alors, c'est tellement gros que je n'y vois plus rien...

    Bonne journée

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je me suis simplement arrêté sur le schéma (physique au passage) avant de lire la suite : ne pensez-vous pas qu'il y a un problème ?

    En ben ça, mssql ne le tolère pas. Apparemment il considère que si on supprime un item de Table1, les ligne correspondantes à Table3 dans Table2 ne pourront plus être mises à jour (NULL sur IDTable3) par la suppression des items dans Table3 via la contrainte entre Table1 et Table3.
    Normal. Cela s'appelle l'intégrité référentielle. C'est ce que vous avez demandé.

    J'ai réalisé exactement le même schéma sur MySql et là, c'est OK.
    Ben c'est du propre

    Il me semblerais qu'une contrainte delete cascade soit prioritaire sur une contrainte delete set null.
    Les contraintes n'ont pas de priorité.
    ça sort de MySQL ça aussi ?

    D'autre part, si l'on supprime un item de Table1, tant les items correspondants dans Table3 que ceux dans Table2 disparaitront. Donc la contrainte delete set null devient caduque dans ce cas...
    Normal aussi.

    Qu'est-ce que vous en pensez ???
    Que votre modèle est faux, et que cela ne me donne pas envie de bosser avec MySQL

    @++

  3. #3
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Citation:
    D'autre part, si l'on supprime un item de Table1, tant les items correspondants dans Table3 que ceux dans Table2 disparaitront. Donc la contrainte delete set null devient caduque dans ce cas...

    Normal aussi.
    Alors justement, la contrainte entre Table3 et Table2 doit être possible...
    Que votre modèle est faux,
    Ça je veux bien mais ça ne fait pas avancer mon schmilblick...

    Donc je m'explique quant au schéma...

    Table1 = des entreprises
    Table2 = des collaborateurs
    Table3 = des bureaux
    Les collaborateurs peuvent avoir ou ne pas avoir de bureau.
    Si je supprime un bureau, tous les collaborateurs de se bureau n'en ont plus. Ils bossent à la maison par exemple. Donc collaborateur.bureau = null
    Si je supprime une entreprise, tous les collaborateurs disparaissent. Tous les bureaux également.

    Alors, comment puis-je représenter cela autrement que par le schéma ci-dessus ?

  4. #4
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Re bonjour elsuket,
    Est-ce que ma vision des choses est complètement fausse ?

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Non, elle me semble correcte.
    Par contre votre modèle n'implémente pas cela.
    Il ne devrait pas y avoir autant de relations.

    Donc :

    - soit vous considérez que les bureaux appartiennent à l'entreprise, et qu'un collaborateur est affecté à un bureau
    - soit vous considérez qu'un bureau est affecté à un employé, et qu'un employé est employé par l'entreprise.

    Quelle est l'assertion qui répond exactement à votre besoin ?

    @++

  6. #6
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Dans mon cas ce serait :
    les bureaux appartiennent à l'entreprise, et un collaborateur est affecté à un bureau

    Mais un collaborateur peut très bien n'être affecté à aucun bureau donc :
    collaborateur.bureau = null

    Je peux très bien ajouter un bureau, y affecter des collaborateurs.
    Je peux aussi supprimer un bureau. Dans ce cas tous les collaborateurs affectés à ce bureau n'ont plus de bureau mais, par contre, ils font toujours partie de l'entreprise...

    Ca, c'est l'exemple simplifié de mon problème.

    En réalité, j'ai un affichage d'une entreprise. Soit :
    - une entreprise qui possède des ateliers
    - des ateliers qui possèdent des machines
    Ce schéma là est la représentation physique de la réalité. Donc une machine ne peut pas exister si elle ne fait pas partie d'un atelier. Jusque ici, pas de problème.

    Maintenant, sur l'interface de l'application, l'utilisateur peut créer sa propre structure d'entreprise pour ranger ces machines par groupes et ce de manière totalement libre.

    Donc :
    - une machine peut appartenir à un groupe ou non. -> machine.groupe = groupe ou NULL
    - un groupe fait par contre forcément partie d'une entreprise

    Alors :
    - si je supprime l'entreprise, je supprime par contrainte les atelier et les machines d'un côté, les groupes de l'autre.
    - si je supprime un groupe, je dois forcément mettre les références à ce groupe dans les machine à NULL...

  7. #7
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Bon, ben tant pis.
    Je me mets sur mysql.... Là au moins ça fonctionne

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    ça fonctionne mais c'est conceptuellement faux.
    Désolé je n'ai pas eu le temps de me mettre dessus.

    @++

  9. #9
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Bonjour,

    Citation Envoyé par ppphil Voir le message
    Dans mon cas ce serait :
    les bureaux appartiennent à l'entreprise, et un collaborateur est affecté à un bureau

    Mais un collaborateur peut très bien n'être affecté à aucun bureau donc :
    collaborateur.bureau = null
    Lorsque l'on utilise un SGBDR, on évite NULL.

    D'après ce que j'ai compris si on remonte au niveau du MCD Merisien, vous avez quelque chose qui ressemble à ceci:

    Entreprise -0,N------(situer)-------1,1- Bureau
    Collaborateur -0,1---(affecter)----0,N- Bureau

    La cardinalité 0,1 du collaborateur, entraine la création du table "de jointure" au niveau du MLD.

    La structure des tables (clés primaires soulignées, clés étrangères en italique):

    Entreprise(ent_id, ent_nom)
    Bureau(bur_id, bur_nom, ent_id)
    Collaborateur(col_id, col_nom)
    Affecter(col_id, bur_id)

    Lorsqu'un Collaborateur est affecté à un Bureau, il y a une ligne dans la table Affecter. Là, vous pouvez faire tout ce que vous voulez.

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Si vous aviez utilisé un outil de conception de schéma de bases de données relationnelle comme Power AMC par exemple il vous aurait immédiatement trouvé une erreur dite de cycle dans le modèle conceptuel !
    Vous n'auriez pas pu monter un tel modèle au niveau conceptuel car il est faux.

    Le fait que MySQL permettent de telles imbécilités est la preuve que l'on est pas un face d'un SGBDR un tant soit peu sérieux... les défauts de MySQL sont si nombreux, qu'il est difficile de parler de SGBDR, mais plutôt de gestionnaire de fichier à la sauce SQL !

    Commencez par apprendre la modélisation de données avec la notation de votre choix : Merise, UML2, E/R, IDEF1X...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Merci beaucoup Oishiiii !
    J'avais le nez trop près du guidon...
    Bonne fin de journée !!

  12. #12
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Dans le monde réel ...
    Lorsque l'on utilise un SGBDR, on évite NULL.

    D'après ce que j'ai compris si on remonte au niveau du MCD Merisien, vous avez quelque chose qui ressemble à ceci:

    Entreprise -0,N------(situer)-------1,1- Bureau
    Collaborateur -0,1---(affecter)----0,N- Bureau

    La cardinalité 0,1 du collaborateur, entraine la création du table "de jointure" au niveau du MLD.

    La structure des tables (clés primaires soulignées, clés étrangères en italique):

    Entreprise(ent_id, ent_nom)
    Bureau(bur_id, bur_nom, ent_id)
    Collaborateur(col_id, col_nom)
    Affecter(col_id, bur_id)

    Lorsqu'un Collaborateur est affecté à un Bureau, il y a une ligne dans la table Affecter. Là, vous pouvez faire tout ce que vous voulez.[/QUOTE]



    Ce qui implique que toute clé étrangère "nullable" nécessite une table de liens...

    En dehors de la lisibilité des modèles, forcément amoindrie, et des requêtes SQL, artificiellement complexifiées, quels sont les autres avantages de cette table Affecter : performances, ... ?

    En outre, comment lister tous les employés, qu'ils aient un bureau ou non ?

    Finalement, serais-je trop laxiste en termes de dénormalisation ?

  13. #13
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Citation Envoyé par lespaul Voir le message
    Ce qui implique que toute clé étrangère "nullable" nécessite une table de liens...
    Oui, c'est ce qui se passe lorsqu'on applique c'est méthode de décomposition pour éviter NULL.

    Citation Envoyé par lespaul Voir le message
    En dehors de la lisibilité des modèles, forcément amoindrie, et des requêtes SQL, artificiellement complexifiées, quels sont les autres avantages de cette table Affecter : performances, ... ?
    Qu'appelez-vous la "lisibilité des modèles" ?
    Je ne vois pas en quoi les requêtes SQL seraient "complexifiées" (lesquelles et par rapport à quoi?).
    Si une requête SELECT vous semble trop "complexe" vous pouvez toujours en faire une vue.
    Quant aux performances, je ne pourrais rien affirmer car je n'ai pas le temps de prouver quoi que ce soit mais j'imagine bien que les optimiseurs de nos SGBDs se passeraient bien volontier de ces NULL…
    Evitons les affirmations ou les sous-entendus basés uniquement sur des a priori.

    Citation Envoyé par lespaul Voir le message
    En outre, comment lister tous les employés, qu'ils aient un bureau ou non ?
    Les employés, ou collaborateurs ici sont à leur place dans la table Collaborateur, qu'ils aient un bureau ou non. Un simple SELECT devrait suffire:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT col_id, col_nom FROM Collaborateur;

    Citation Envoyé par lespaul Voir le message
    Finalement, serais-je trop laxiste en termes de dénormalisation ?
    Je ne pense pas qu'il soit possible d'être laxiste en dénormalisation puisqu'en effet celle-ci ne suit aucune règle contrairement au processus de normalisation.

    Dans le monde réel, il est tout a fait possible de réaliser une BDD ne comportant aucun NULL et cela ne pose aucun soucis, sauf psychologiques pour certains face à un nombre de table relativement important, mais les vues sont la pour simplifier la vie des utilisateurs.

    Le langage SQL permet de faire tout et n'importe quoi, à chacun d'en faire ce qu'il veux.
    J'essaye de respecter la théorie relationnelle et donc j'évite NULL qui bien sûr n'en fait pas parti.

    Les problèmes des NULLs et de la 3VL ainsi que la gestion de l'information manquante ont largement étaient étudiés.
    Voyez par exemple le dernier ouvrage de Date et Darwen à ce sujet: Database Explorations

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de relations
    Par dolphin96 dans le forum Access
    Réponses: 3
    Dernier message: 23/07/2006, 22h24
  2. Problème de relation double
    Par Rub-n dans le forum Access
    Réponses: 1
    Dernier message: 31/05/2006, 18h07
  3. Problème de relation entre deux tables + autre chose
    Par Goth_sensei dans le forum Langage SQL
    Réponses: 7
    Dernier message: 30/03/2006, 20h49
  4. [conception] Requête de sélection problèmes de relations
    Par snoopy69 dans le forum Modélisation
    Réponses: 26
    Dernier message: 08/11/2005, 14h23
  5. Gestion club sportif (problème de relations )
    Par jemaflo dans le forum Access
    Réponses: 3
    Dernier message: 03/10/2005, 23h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo