Association rélfexive ou Identifiant relatif ?

Association rélfexive ou Identifiant relatif ? - SQL/NoSQL - Programmation

Marsh Posté le 03-01-2005 à 20:34:38    

Salut les amis,
 
Je vais vous énoncer vite fait le problème et la solution que j'ai envisagé et vous essayerai de me dire si y'a un autre moyen parce que je crois qu'il y'a une cacahuète :D  
 
Alors, nous avons au moins 2 tables, CATAGORIE et DOCUMENT. La relation est à priori simple : Un document est rangé dans une ou plusieurs catégories et dans une catégorie peuvent se trouver aucun ou plusieurs documents.
 
Là où ça part un peu en freestyle, c'est que mon maître de stage souhaite créér une sorte d'annuaire à l'aide des catégories. Un peu comme l'annuaire de google je pense. Donc, il faut que je trouve le moyen de créer une arborescence des catégories sachant qu'une catégorie peut être le "parent" d'aucune ou plusieur autres catégories et qu'une catégorie peut être la "fille" d'une catégorie.  
Par exemple, nous devrions pouvoir avoir une catégorie "Région", qui contiendrai la "Lorraine" et que la catégorie "Lorraine" pourrait contenir la "Meuse", toutes étant une catégorie parente ou fille de l'autre. Sur ce dernier point, je pensais faire une association réflexive... qu'en pensez-vous ? :ange:  
 
Autre problème, je me demande comment je vais gérer la notion de niveau entre les catégories :??: Région > Lorraine > Meuse....je me noie :pt1cable:  
 
Merci à vous.

Reply

Marsh Posté le 03-01-2005 à 20:34:38   

Reply

Marsh Posté le 03-01-2005 à 21:11:08    

Il te faut 2 clés catégories dans la table des catégories : une (primaire) pour la catégorie elle-même, et une autre (étrangère) pour la catégorie parente (si elle existe).
 
Exemple :
 
id catégorie : 1
nom : Lorraine
id catégorie parente : NULL
 
id catégorie : 2
nom : Meuse
id catégorie parente : 1
 
Ca découle d'une association de la table catégorie sur elle-même ... (ça doit être ce que tu appelles réflexive, mais les cours de BDD sont loin pour moi :D ).

Reply

Marsh Posté le 04-01-2005 à 06:59:46    

oui c'est bien ce que j'avais fait dans mon MCD mais ça me laisse perplexe. En fait, la relation entre parent et fille se fait dans l'association "APPARTENIR" qui contient effectivement "id_cat" et "id_sous_cat" qui décrit bien la relation de parenté.
 
Maintenant, j'essaye de trouver une solution pour créer une arborescence de tout ça :D....ça va pas être simple, ze sais pas pourquoi. Il me faudrait un truc dans le genre de l'arborescence du forum de hardware.fr tout en haut là...si vous avez des idées, n'hésitez pas ;)

Reply

Marsh Posté le 04-01-2005 à 11:08:48    

Je ne vois pas comment il est possible de représenter directement un arbre n-aire dans un tableau. La solution présenté ci-dessus me semble la seule mais elle est peu utilisable en l'état car il faut multiplier les requètes pour retrouver l'arborescence. S'il ne s'agit que de définir les tables (modèle de donnée) l'optimisation ci-dessous est inutile.
 
Donc pour moi le plus gros problème c'est d'éviter les requetes multiple pour retrouver les "parents" (éventuels) d'une catégorie. Pour moi et comme indiqué dans un autre thread
http://forum.hardware.fr/hardwaref [...] 1450-1.htm , il faudrait rajouter le "chemin" d'une catégorie sous forme de chaîne. Le problème dans ce cas est la mise à jour de l'arborescence (génération de feuilles/déplacement de branche) car il faut maintenir en plus la chaîne.
 
Pour la création d'une feuille il suffit juste de rajouter au chemin du parent l'id du parent. Pour déplacer une branche de l'arbre, il faut alors remplacern pour tous les éléments de la branchen le début de la chaîne qui correspond à l'ancien chemin de la branche pour le nouveau chemin, soit qqch du style :

UPDATE categorie SET chemin=REPLACE(chemin, [ancien_chemin],[nouveau_chemin]) WHERE chemin LIKE "[ancien_chemin]%";


Bon faudra faire gaffe aux effets de bords....
 
++

Reply

Marsh Posté le 04-01-2005 à 12:51:17    

ce matin j'ai justement vu ce post et j'ai opté pour une telle méthode. J'en ai discuté avec mon maître de stage et apparement, on pourra créer, supprimer ou simplement renommer une catégorie, sans la déplacer.
 
Donc là je me retrouve avec un truc du genre :
 
Categorie :
 
.0 | Voiture
.0.1 | Berline
.0.2 | Coupé
.0.3 | Décapotable
 
.1 | Blabla
.1.1 | Blablablaba
.1.2 | etc....
 
Voilà, et je trouve que la méthode proposée par l'autre membre sur le thread que tu cite est pas mal. Cependant, je sèche sur un truc là, comment je fais par exemple pour afficher uniquement les catégories qui sont à la racine, dans cet exemple, le .0 et .1, sans prendre les autres ?
 
edit : pour info, je vais exploiter la base de donnée avec PHP, il doit y avoir des fonctions intéressantes à utiliser, tel que explode par exemple.


Message édité par Inekman le 04-01-2005 à 12:52:00
Reply

Marsh Posté le 04-01-2005 à 12:58:13    

Je pense qu'il faut quand même garder les champs "id" et "parent_id". cela permet de faire des recherche à un niveau donné très rapidement (ex tous les fils de la catégorie 2) car cela est basé sur la comparaison d'entier, le coup des chaines n'étant qu'une astuce pour ne pas faire n requetes pour retrouver l'arborescence d'une catégorie donnée. Dans ce cas, les noeuds racines seront ceux qui auront NULL dans parent_id...


Message édité par dreameddeath le 04-01-2005 à 13:02:31
Reply

Marsh Posté le 04-01-2005 à 13:33:39    

ah yes, c'est bon ça :D  
Merci beaucoup Dreamed, tu m'a beaucoup aidé sur ce coup.  
 
Big up et EXCELLENTE année 2005 à vous tous ;)

Reply

Marsh Posté le 04-01-2005 à 14:13:27    

C'est quel SGBD ?
 
Oracle par exemple permet en une seule requête (utilisant des START WITH / CONNECT BY) de récupérer directement une arborescence stoquée dans une même table ... :)

Reply

Marsh Posté le 05-01-2005 à 12:38:28    

Non là c'est MySQL.
 
Finalement j'ai viré les parent_id parce qu'il y avait redondance dans la base et ça le faisait pas trop. La rapidité, kiffe-kiffe, elle est pas énorme la table et y'a pas 15000 enregistrements à gérer.
 
Dans l'état actuel, je m'en sors avec 1 seule requête pour tout récupérer dans un tableau et afficher l'arborescence.
 
Je me retrouve avec un tableau du genre :
[fixed]
Array (
    Array (
      [0]->.1
      [1]->.1.1
      [2]->.2
      [3]->.2.1
      [4]->.2.1.1
      [5]->.2.1.2
      [6]->.2.2
      [7]->.2.3
    }  
Array (
      [0]->Aide
      [1]->truc
      [2]->Voiture
      [3]->audi
      [4]->A4
      [5]->A6
      [6]->Merko
      [7]->BM
    }  
}
 
C'est assez pratique pour afficher les données.
 
Maintenant, je me demande comment je peux faire pour afficher uniquement la racine par exemple. avoir que .1, .2, .3 etc. Là j'arrive avoir uniquement le .1 ou .2 ou .3 mais pour les avoir tous :ange:...j'ai pensé faire une tite roquette dans une boucle qui récupère les id like ".$i"...enfin ché pas trop.
 
Qu'en pensez-vous ?


Message édité par Inekman le 05-01-2005 à 12:39:43
Reply

Marsh Posté le 05-01-2005 à 12:48:01    

Dans MySQL je crois que la commande LIKE "._" pourrait résoudre le problème (le "_" représentant 1 caratère...)
Sinon regarde aussi la commande RLIKE (pour les expressions régulières) mais pour ce qui est des perfs dans ce cas...


Message édité par dreameddeath le 05-01-2005 à 12:50:46
Reply

Marsh Posté le 05-01-2005 à 12:48:01   

Reply

Marsh Posté le 05-01-2005 à 12:49:49    

Son ID peut sûrement être sur plusieurs chiffres, donc il faut plutôt regarder du côté de REGEXP :
http://dev.mysql.com/doc/mysql/en/Regexp.html

Reply

Marsh Posté le 05-01-2005 à 13:46:25    

Yes, merci bien les gars, je vais essayer de regarder ça cet après-midi au taf. Je vous dirai ce soir ce qu'il en est, s'il se passe quelque chose de positif.
 
Bonne journée les amis.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed