Je me méfie généralement des suppressions en cascade (et d'autres actions automatiques qui pourraient supprimer / endommager les données), via des déclencheurs ou ON <something> CASCADE
. Ces installations sont très puissantes, mais aussi potentiellement dangereuses.
- Donc, la suppression en cascade est-elle un bon choix ici?
Il ferait certainement ce que vous recherchez: supprimer les enregistrements associés lorsqu'un enregistrement parent est supprimé, sans que vous ayez besoin d'implémenter une autre logique pour vous assurer que les enfants sont supprimés en premier, ce qui rend votre code plus concis. Toutes les actions seront enveloppées dans une transaction implicite, donc si quelque chose bloque, l'enfant supprime toute l'opération est bloquée, maintenant l'intégrité référentielle avec peu ou pas d'effort de codage supplémentaire.
Assurez-vous que votre utilisation des suppressions en cascade et autres actions "en coulisses" est bien documentée afin que les futurs responsables du système en soient pleinement conscients.
- Quand ne pas utiliser le detele en cascade?
Il ne faut pas l'utiliser si vous êtes paranoïaque comme moi! Un point clé à considérer est les autres développeurs qui travaillent actuellement ou pourraient travailler sur votre code / base de données (d'où le commentaire ci-dessus sur la documentation de tout comportement "caché").
Il est assez courant dans mon expérience que des personnes inexpérimentées les utilisent DELETE
puis les ré- INSERT
mettent à jour afin de mettre à jour les lignes, surtout quand elles veulent vraiment une opération MERGE
/ UPSERT
(mettre à jour les lignes existantes et en créer de nouvelles là où une ligne avec une clé donnée n'existe pas) et le SGBD ne prend pas en charge la fusion / upsert (ou ils ne connaissent pas son support). Sans actions en cascade, cela est parfaitement sûr (ou entraînera une erreur lorsqu'il menace l'intégrité des données), mais si quelqu'un le fait pour les lignes d'une table parent où les FK de référence ontON DELETE CASCADE
définir alors les données liées seront supprimées à la suite de la suppression initiale et non remplacées - donc les données sont perdues (pas que même si la suppression et l'insertion subséquente sont enveloppées dans des transactions explicites, la cascade se produit avec l'opération de suppression - elle ne le sera pas attendez de voir si la transaction remplace les lignes de la table parent dans les instructions suivantes) et la cascade pourrait continuer à travers d'autres navires de relation (par exemple: supprimer un superviseur principal, son équipe est supprimée par cascade, les équipes de ses équipes sont supprimées par cascade, tous les enregistrements suivis pour toutes ces personnes sont supprimés par cascade, ...). Sans la mise en cascade activée, vous obtiendriez simplement une erreur ici au lieu de perdre les données en silence.