1

C'est encore moi!
Ce que je souhaiterai faire c'est hierarchiser des données en catégories.

Par exemple Continent>Pays>Region>departement>villes
Au debut je pensais procéder comme suis: utiliser deux chiffres pour chaque catégories et les acoler, chaque élement ville possédera alors un ID unique.
Par exemple Paris "serait"(son ID dans ma table mysql) : 0101010101
L'ile de france serait: 0101010100(on met des 00 quand on ne veut pas regarder les catégories "enfants")
... et l'Europe aurait pour ID: 0100000000

Seul problème ca me fait des entiers très longs et puis si je veux mettre toutes les villes du monde il va pas falloir coder sur deux chiffres les villes mais sur beaucoup plus, de meme pour les regions etc

J'ai alors penser à me tourner vers des lettres, ce qui permettra d'avoir moins de caractères, ou meme si c'est long, stocker ca dans une table sous form de TEXT.
Le problème c'est que la gestion va etre un plus compliquée.
Y a -til une autre solution communément utilisée qui permet de réaliser ce que je veux faire?
Merci.

2

sans trop réfléchir, mais juste pour l'idée :

pourquoi est-ce que tu ne fais pas une table avec un champ "identifiant-parent" ?
un peu comme ça :
(table 'entites')
- id
- #id_parent
- nom
- #id_type

avec #id_type clef étrangère vers une table te donnant si c'est, par exemple :
(table 'type')
- 1, 'continent'
- 2, 'pays'
- 3, 'ville'

et, par exemple, tu aurais des enregistrements tels ceux-ci :
- 1, NULL, 'Europe', 1
- 2, 1, 'France', 2
- 3, 1, 'Allemagne', 2
- 4, 1, 'Belgique', 2
- 5, 2, 'Paris', 3
- 6, 2, 'Lyon', 3
- 7, 2, 'Lille', 3

pour retrouver les pays d'europe, ça sera genre
select * from entites where id_parent = 1

pour les villes de France, du style
select * from entites where id_parent = 2

Bon, après, ça se complexifie si tu veux bosser sur plusieurs niveaux de hiérarchie, genre pour retrouver toutes les villes d'europe
Avec des requetes imbriques (en mySQL, supportées uniquement depuis la version 4.1), ça serait du genre :
select * from entites where id_parent IN (select id from entites where id_parent = 1)
(on garde les entités (=villes) dont le parent est une entité (=pays) qui a pour parent l'europe)

pas forcément LA solution optimale, mais ça te permet n'importe quel niveau de précision : pour certains endroits, tu peux ne mettre que le pays, pour d'autres, tu peux descendre aux rues ^^


sinon, tu as la possibilité de faire moins générique, mais peut-être plus facile à se représenter :
un table pour les continents, une pour les pays, une pour les ville, avec dans chaque table (sauf pour celle le plus haut dans la hiérarchie) une colonne qui pointe sur l'enregistrement en table parente
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

3

Merci pour l'idée je suis en train d'implémanter ça. Mais j'ai un petit problème.
Je souhaite afficher sous une forme arborescente mes données du genre

France
---->Paris
---------->Tour eiffel
---------->arc de triomphe
---->Marseille
---------->Port
Belgique
---->Bruxelles
--------->Parlement

etc

Donc je pensais faire un première requete SQL pour avoir la liste des entrées avec un id_parent=NULL
Je prend le premier élément de ce tableau(avec l'ID=1 par ex) et je mets dans une autre liste l'ensemble des données ayant pour id_parent 1(meme exemple)
Ainsi de suite... Mais comment bien "mémoriser" tout les "niveaux"?(j'arrive pas à etre clair dsl)
Je pourrais très bien faire du copier/coller de code pour chaque niveau d'arborescence, mais c'est moche et pas pratique si jamais je décide d'ajouter une catégorie "rue" par exemple.
Peut etre que ce type de problème peut etre traité par un algorithme récursif, mais je suis très mauvais en algo récursif(et je sais meme pas si le php le gère correctement).
Là encore ce doit etre un problème assez classique mais je trouve rien.
Une autre idée lumineuse serait la bienvenue wink

4

effectivement, une solution récursive me semble idéale, pour une arborescence de profondeur non fixe.
du genre

pour toutes les entités de niveau N
afficher l'entité de niveau N
recommencer sur les entités de niveau N +1 qui ont l'entité de niveau N comme parent

après, ça risque de te faire pas mal de requêtes... et donc, de pas être ultra-rapide...
il doit y avoir moyen d'accèlérer un peu ça, genre en pré-chargeant une partie des données tout d'un coup vers un tableau, et de les traiter ensuite...
Mais là, sur le vif, j'ai pas d'explication brève et simple qui me vienne à l'esprit ^^
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

5

Tu peux aussi tres bien utiliser un arbre (preorder-tree):
D'ailleurs y'a un article la dessus:
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

6

Oui la solution de neuroo est mieux.
Parce que charger toutes les données => très crade, ça veut dire que ton code est pas réutilisable (bah oué des bases de plusieurs To ça existe, mais pas des machines avec plusieurs To de ram)
Requêtes récursives => même problème, si la table grossit tu peux te retrouver à tapper dans les 500000 requêtes, c'est pas top.

7

spectras> oué, je sais bien que ct pas terrible mes idées ^^

nEUrOO> je met en favoris, je lirai un de ces jours, ça a l'air pas mal cheeky
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall