Bonjour, dans ma réalisation d'un forum, je me heurte actuellement à un problème.

Le forum se compose en partie d'une table pour gérer les droits, une table pour les catégories qui possède une clé étrangère sur les droits, une table pour les sections qui possède une clé étrangère sur la catégorie ainsi que plusieurs sur les droits, une table pour les sous-sections qui possède une clé étrangère sur les sections et plusieurs sur les droits.

Mon problème se pose lors de la suppression d'un tuple d'une des tables. Par exemple, on supprime une catégorie, que faire alors des sections qui y été rattaché (implicitement des sous-sections). Lorsqu'on supprime un droit que faire des catégories, sections et sous-sections éventuelle qui possédait ce droit.

Je connais le ON DELETE CASCADE mais ce n'est pas ce que je souhaiterais, j'aimerais plus un ON UPDATE CASCADE.

En fait voilà ce que je souhaiterais. Lorsque l'on supprime une catégorie, on attribue la section à une catégorie que l'on pourrait considérer comme une catégorie que possède les sections en attente d'attribution d'une catégorie. De même pour les sous-sections etc...

Par contre je voulais savoir comment mettre cela en place, le plus simple serait de créer dans chaque table un tuple qui sert à cela mais il faudrait que je gère le fait dans mon panneaux d'administration qu'on ne peux pas la supprimer (oui car mon panneau d'administration permet de gérer les droits, catégories etc...). Est ce une solution viable ou existe t-il un meilleur moyen ?

Bien sûr je pense mettre cela en tant que TRIGGER, de même si je ne dois pas permettre la suppression de mon tuple "en attente d'attribution". Est ce une bonne solution ?

Autre chose, lorsque le trigger empêche de réaliser une requête on n'a pas de retour d'erreur, ou du moins une exception est levé sans information supplémentaire. Si on veux informer l'utilisateur de ce qui se passe il faut aussi gérer cela coté php en créant aussi les contraintes ?

Merci de votre aide !

7 réponses


Dans la représentation intervallaire (ce qu'il est conseillé de faire et d'appliquer quand on veut représenter plusieurs sous niveaux de manière fiable) on crée une branche tampon pour stocker les données en attendant de préparer le terrain. Tu peux donc par exemple créer une catégorie test (ou un forum test) que tu n'afficheras pas, et qui contiendrait tous tes éléments en cas de suppression de l'élément parent.

Euh personnellement, si je peux faire un commentaire sur tes tables, c'est que je ne pense pas qu'il soit nécessaire que tu possèdes 3 tables pouur faire des Catégories/forums et sous forum. Une table suffit :)

Ensuite, c'est une mauvaise idée de permettre directement la suppression d'un forum sans gérer les cas où il y aurait des données rattachées. C'est quelque chose que tu dois inclure dans ton script et gérer des updates. Je pense pas que tu puisses gérer des update en invoquant un delete.

Par contre rien, si tu veux delete un forum... rien n'empêche de faire un update vers un Parent qui ne serait pas affiché, qui va faire un update en cascade. Et ensuite faire ton Delete, qui n'aura aucune action. Une façon de grugger le trucs si tu ne veux réellement pas gérer le transfert des données vers une autre catégories/forum dans ton code, mais ce serait pas une méga bonne idée selon moi

Il y a aussi les triggers de bdd comme possibilités

@kewai : Pour mes tables, je ne pense pas que je peux fusionner catégorie, forum et sous-forum. Oui pour forum et sous-forum qui au final sont identiques, par contre une catégorie ne nécéssite pas autant d'information à stocker qu'un forum, du moins dans ma conception.
Sinon il est possible de gérer des updates avant un delete avec les triggers.

Que veux-tu dire par données rattachées ? C'est un peux ce que j'ai expliqué, le fait d'avoir une clé étrangère sur le tuple ?

Donc au final, d'après vos réponses (et je vous remercie de vous pencher sur mon problème), une solution serait de partir sur un tuple "tampon" qui contiendrait toutes les données en attente d'attribution. Il ne sera pas affiché dans la partie administration pour éviter ansi de le supprimer.

Avec la représentation intervallaire tu crées une table forums avec un champ f_left et f_right, tout en sachant que tu n'es pas obligé de remplir toute ta table dans le cas d'une catégorie ;)

Il y a de très bons tutos sur developez concernant la représentation intervalaire ;)

Oui j'ai commencé à potasser un peu la chose !

Ok, j'ai compris pour la représentation intervallaire, par contre je ne vois pas le lien avec mon problème. Adapté à la représentation intervallaire, cela signifie qu'il y aura au minimum un nœud à chaque niveau et une feuille au bout qui seront donc les tampons.