Arjuna Aircraft Ident.: F-MBSD | orafrance a écrit :
En fait, c'est plutôt les relations n-n moi que je remettais en cause, c'est pourquoi l'exemple familial est mauvais et je te rejoins, pour cet exemple plusieurs tables n'est pas forcément utile.
Imagine alors, la liste des départements et des zones géograhique. On peut définir une zone par 1-n départements, département pouvant être dans 0-n zone. Dans ce cas, les caractèristiques entre une zone et un département sont trop différentes pour ne faire qu'une seule table sans multiplier de manière incosidérée la duplication des données.
|
je suis pas d'accord.
une table unique avec un champ "typezone" fonctionne parfaitement.
il y aura dans tous les cas une table de correspondance joingnant les deux types de zones.
dans le cas où les données sont très différentes, t'as plusieurs solutions :
- tu générises la structure de la table (au lieu de nommer "capitale_de_zone" et "chef_lieu" ), ben tu n'utilises qu'un seul champ, puisque ça contient le même type d'information, c'est à dire une ville.
- tu optes pour un modèle de colonnes "dynamiques", c'est à dire une table contenant, ligne par ligne, les colonnes manquantes.
par exemple :
region
--------
type_reg
id_reg
nom
region_detail
-------------
type_reg
id_reg
nom_detail
valeur_detail
avec une règle permettant pour un type 'R' d'avoir les 'nom_detail' suivant : code_depot, informations_bancaires, etc.
et avec le type 'D', les 'nom_detail' suivant : 'superficie', 'population', 'chef_lieu', 'est_prefecture', etc.
ainsi, t'as pas une seule colonne de trop dans la base, et les requêtes sont simplissimes.
quant aux index, aucun problème, la recopie de 'type_reg' dans la table de détail, t'as bien un index performant sur la PK. couplé à la règle fonctionnelle, t'as même une cohérence parfaite.
le gros intérêt de n'avoir qu'une seule table, permettant de lier "n'importe quoi" avec "n'importe quoi", c'est que justement t'as pas de limite.
Imagie, tu veux représenter la france politique.
"normalement", t'as les éléments :
hameau, ville, canton, département, région, (pays)
mais... t'en fait quoi des DOM TOM ?
comment tu vas les modéliser ? tu va encore rajouter deux tables, une DOM et une TOM ? (les informations sont très différentes entre les deux types) et transformer en joyeux bordel ton code ?
avec mon sytème, j'ai les types 'H' (hameau), 'V' (ville), 'C' (canton), 'D' (département), 'R' (région), 'DOM', 'TOM', avec dans ma table de correspondance les H liés aux V, les V aux C, DOM ou TOM, les C liés aux D, puis les D aux R, et les DOM et TOM liés à rien.
quand je veux proposer à l'utilisateur un filtre pour retrouver un ville par exemple (associée à un canton, dom ou tom), alors j'ai qu'à afficher en premier niveau la liste des zones associées à aucune autre (régions et dom/tom, sans besoin d'expliciter la liste des type), puis dans le sous-filtre je peux filtrer au fur et à mesure, jusqu'à ce que le dernier niveau soit H. En plus, pour les dom tom, un simple "group by" permet de les isoler dans la requête. un petit coup de décode pour les forcer à rester en bas dans la liste, et j'ai corriger le seul bug mineur en 5 minutes maxi.
Je pourrai rajouter autant de niveau que je veux, je n'ai qu'à rajouter des types dans ma base, et refaire les liens.
avec une application convenablement pensée, je n'aurai même pas besoin de changer une seule ligne de code. Message édité par Arjuna le 09-08-2005 à 15:06:10
|