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 :

Est-ce une bonne pratique d'utiliser les DELETE CASCADE ?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Par défaut Est-ce une bonne pratique d'utiliser les DELETE CASCADE ?
    Bonjour,
    On dit toujours qu'il faut gérer les règles métier sur la couche métier. Mais peut-on quand même utiliser la puissance des BDD pour gérer la suppression en cascade grâce à "ON DELETE CASCADE".
    Exemple : quand je supprime une instance d'un objet voiture je supprime aussi ses 4 roues.
    Merci d'argumenter avec des références.
    Est-ce une bonne ou une mauvaise pratique ? Pourquoi ?

    Cordialement.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Tanebisse Voir le message
    Bonjour,
    On dit toujours qu'il faut gérer les règles métier sur la couche métier. Mais peut-on quand même utiliser la puissance des BDD pour gérer la suppression en cascade grâce à "ON DELETE CASCADE".
    Exemple : quand je supprime une instance d'un objet voiture je supprime aussi ses 4 roues.
    Merci d'argumenter avec des références.
    Est-ce une bonne ou une mauvaise pratique ? Pourquoi ?

    Cordialement.
    Généralement NON, particulièrement oui.

    Par exemple si les filles sont systématiquement liées, en lien immuable et en petit nombre => OUI,
    si les filles peuvent être déplacées des références et en grand nombre non.

    Mais il existe d'autres techniques comme SET DEFAULT ou SET NULL qui permettent d'arriver au même résultat via des traitements déportés en batch à condition d'utiliser des vues.

    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/ * * * * *

  3. #3
    Membre éclairé Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Par défaut
    Je n'ai pas bien compris ta réponse "si les filles peuvent être déplacées des références " ni la technique de "SET DEFAULT ou SET NULL".
    La vraie question que je pose c'est faut-il systématiquement gérer ça en JAVA ou autres (couche métier) ou peut-on utiliser des DELETE CASCADE. Pourquoi c'est bien ou pourquoi c'est mal ?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Tanebisse Voir le message
    Je n'ai pas bien compris ta réponse "si les filles peuvent être déplacées des références " ni la technique de "SET DEFAULT ou SET NULL".
    La vraie question que je pose c'est faut-il systématiquement gérer ça en JAVA ou autres (couche métier) ou peut-on utiliser des DELETE CASCADE. Pourquoi c'est bien ou pourquoi c'est mal ?
    Aucune couche de programmation ne peut simuler l'équivalent des contraintes de bases de données à l'exception des contraintes de domaines.
    Il est impossible à un programme JAVA ou C d'effectuer ce travail de fait de deux problématique :
    • le fonctionnement naturellement ensemblistes des SGBDR
    • la problématique de gestion des accès simultanés concurrentiels.


    Donc, non, vous n'obtiendrez jamais d'équivalent en JAVA à ce que fait nativement un SGBDR !

    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/ * * * * *

  5. #5
    Membre éclairé Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Il est impossible à un programme JAVA ou C d'effectuer ce travail de fait de deux problématique :
    En java je fais 2 actions
    1. je supprime les roues
    2. je supprime la voiture

    le problème c'est que si je dois gérer en plus la suppression des pneus et des enjoliveurs, ça fait beaucoup de code pour pas grand chose alors qu'avec un DELETE CASCADE c'est beaucoup plus simple.
    J'ai du me tromper de catégorie pour ma question car c'est plus une question de développeur que de DBA.
    Mais merci pour les tuyaux.

  6. #6
    Membre éclairé Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Par défaut
    Merci StringBuilder pour tes précisions.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Tanebisse Voir le message
    En java je fais 2 actions
    1. je supprime les roues
    2. je supprime la voiture

    le problème c'est que si je dois gérer en plus la suppression des pneus et des enjoliveurs, ça fait beaucoup de code pour pas grand chose alors qu'avec un DELETE CASCADE c'est beaucoup plus simple.
    J'ai du me tromper de catégorie pour ma question car c'est plus une question de développeur que de DBA.
    Mais merci pour les tuyaux.
    Et si votre code Java tombe en panne au milieu vous faites quoi ?????

    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/ * * * * *

  8. #8
    Membre éclairé Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Mais il existe d'autres techniques comme SET DEFAULT ou SET NULL qui permettent d'arriver au même résultat via des traitements déportés en batch à condition d'utiliser des vues.
    OK j'ai vu pour SET DEFAULT ou SET NULL par contre pourquoi des batchs ou traitement déportés ?

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Tanebisse Voir le message
    OK j'ai vu pour SET DEFAULT ou SET NULL par contre pourquoi des batchs ou traitement déportés ?
    SET DEFAULT et SET NULL vont présenter de fausses informations puisqu'un client par défaut (par exemple Âne Onyme) comme un client NULL c'est pas terrible pour une facture !

    Dans ce cas on présente aux applications des vues qui éliminent les fausses lignes (effacement logique).

    La nuit, aux heures creuses, on lance les bach de traitement de purge effective qui vont supprimer les "fausses" ligne par lot de 500 par exemple.

    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/ * * * * *

  10. #10
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Pour faire simple, si un DELETE CASCADE a pour effet de supprimer quelques dizaines de lignes dans une poignée de tables, l'impact sur le moteur de base de données sera relativement faible.
    En revanche, s'il porte sur des millions de lignes dans des centaines de tables, là, pour faire tenir tout ça dans une transaction, ça va poser des locks un peu partout, avec le risque de deadlocks (être bloqué par une autre transaction qui elle-même est bloquée par la nôtre) et risque d'effrondrer les performances du SGBD, voir même de le bloquer.

    En alternative aux valeurs "virtuelles" que propose SQL Pro, vous pouvez, depuis votre application cliente, gérer la suppression de toutes les filles connues au moment de la suppression, avant de terminer par un DELETE CASCADE pour shooter les quelques lignes qui auraient pu passer entre les mailles (en raison des traitements concurrents).

    Sinon, en plus simple, vous pouvez apposer un flag sur vos tables, que vous pourrez propager par trigger au besoin : ces lignes seront écartées des traitements applicatifs, et vous aurez tout le loisir de les supprimer par lot, sans risque d'accès concurrent, à un moment plus calme.

Discussions similaires

  1. [EJB] Quelles bonnes pratiques pour utiliser les transactions "en ligne"?
    Par kisitomomotene dans le forum Java EE
    Réponses: 1
    Dernier message: 12/12/2011, 20h22
  2. Réponses: 4
    Dernier message: 02/02/2010, 23h49
  3. Réponses: 2
    Dernier message: 27/01/2009, 22h45
  4. [Python] Est-ce une bonne idée d'utiliser des modules pour stocker des objets ?
    Par Neolander dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 05/04/2008, 14h45
  5. Est-ce une bonne utilisation de fgets ?
    Par clampin dans le forum C
    Réponses: 8
    Dernier message: 04/07/2007, 12h01

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