Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1716 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Association rélfexive ou Identifiant relatif ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Association rélfexive ou Identifiant relatif ?

n°936079
Inekman
Posté le 03-01-2005 à 20:34:38  profilanswer
 

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.

mood
Publicité
Posté le 03-01-2005 à 20:34:38  profilanswer
 

n°936108
Beegee
Posté le 03-01-2005 à 21:11:08  profilanswer
 

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 ).

n°936234
Inekman
Posté le 04-01-2005 à 06:59:46  profilanswer
 

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 ;)

n°936371
dreameddea​th
Posté le 04-01-2005 à 11:08:48  profilanswer
 

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....
 
++

n°936528
Inekman
Posté le 04-01-2005 à 12:51:17  profilanswer
 

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
n°936540
dreameddea​th
Posté le 04-01-2005 à 12:58:13  profilanswer
 

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
n°936576
Inekman
Posté le 04-01-2005 à 13:33:39  profilanswer
 

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 ;)

n°936613
Beegee
Posté le 04-01-2005 à 14:13:27  profilanswer
 

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 ... :)

n°937680
Inekman
Posté le 05-01-2005 à 12:38:28  profilanswer
 

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
n°937701
dreameddea​th
Posté le 05-01-2005 à 12:48:01  profilanswer
 

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
mood
Publicité
Posté le 05-01-2005 à 12:48:01  profilanswer
 

n°937707
Beegee
Posté le 05-01-2005 à 12:49:49  profilanswer
 

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

n°937793
Inekman
Posté le 05-01-2005 à 13:46:25  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Association rélfexive ou Identifiant relatif ?

 

Sujets relatifs
Path Relatif / Absolue dans "opentextfile"[CSS]calque relatif aligné en bas de la page
FileInputStream et chemin relatifprobleme avec identifiant de session dans l'URL
PHP sous unix comment faire un require sur un fichier en relatifIdentifiant numérique de longueur fixe
chemin relatif ou absolu[VC++6] Comment enregistrer une appli sous Windows? (association, etc)
Lien relatif ou absolu ?[UML] association / dépendance + namespace en UML
Plus de sujets relatifs à : Association rélfexive ou Identifiant relatif ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR