Bonjour,
le 01/11/2011 à 11:24, pif a écrit dans le message
<4eafc8ee$0$24233$
426a...@news.free.fr> :
> Bonjour, pas évident, les explications sont pas super claires, mais
> c'est aussi un peu logique, car sinon, pas de problème pour
> modéliser...
Effectivement. Je pensais avoir tout de même bien décrit le problème.
> bon, alors je résume, en gros t'as un graphe orienté, ce qui reste une
> structure de données des plus élémentaires: des sites (les sommets) et
> des liens (les aretes):
Peut-être, je ne connais absolument rien en théorie des graphes. Si tu
me dis que c'est indispensable pour résoudre mon problème, je veux bien
y jeter un œil.
> donc t'as grossomodo 2 entités:
>
> Site (id, nom, gps_x, gps_y, ... )
> Lien (id_src, id_dst, bande_frequence, debit, ...).
>
> L'id du site est la PK, les deux ids de liens sont des FK et
> constituent toutes les deux une PK de ta table lien (tu peux créer un
> identifiant si tu peux avoir plusieurs connexions entre deux meme site
> ou pour diverses raison techniques).
>
> si t'as une info dépendante du site (ex: affaiblissement, tu as
> grossomodo deux solutions:
>
> - si les attributs ne sont pas tres nombreux, tu modifie la table lien:
> Lien (id_src, id_trg, bande_frequence, debit, affaiblissement_src,
> affaiblissement_trg, ...).
>
> , tu créé en effet une entité lien avec une laison many to many genre:
>
> Site (id, nom, gps_x, gps_y, ... )
> Lien (id, bande_frequence, debit, ...)
> et une table d'association:
> Lien_Sites (id_site, id_lien, orientation (src ou cible),
> affaiblissemet, etc.).
>
> dans ce cas, tu peux mettre une contrainte d'unicité sur (id_lien,
> orientation) pour éviter d'avoir plusieurs sources ou destinations
> tu peut avoir une PK (ou unicité) sur (id_site,id_lien)...
Ok, c'est ce que j'ai décrit.
>> À ce stade, j'ai déjà quelques questions :
>> 1) comment afficher une ligne avec les informations suivantes ?
>> - lien_id
>> - site_id où le coté est A
>> - site_id où le coté est B
>
> dans le premier cas le plus simple:
[je le rappelle pour plus de clarté
Site (id, nom, gps_x, gps_y, ... )
Lien (id_src, id_dst, bande_frequence, debit, ...).
]
Pour moi c'est un peu plus simple (tu as supprimé lien_id mais ça ne
change rien) :
SELECT id_src, id_dst FROM lien;
> dans le second cas:
[
Site (id, nom, gps_x, gps_y, ... )
Lien (id, bande_frequence, debit, ...)
Lien_Sites (id_site, id_lien, orientation (src ou cible),
affaiblissemet, etc.)
]
> select ....
> from lien l
> join lien_site ls_src on
l.id = ls_src.id_lien
> and ls_src.orientation = 1
> join site src on ls_src.id_site =
src.id
> join lien_site ls_trg on
l.id = ls_trg.id_lien
> and ls_trg.orientation = 0
> join site trg on ls_trg.id_site =
trg.id
Il faut que je teste car j'ai du mal a suivre la requête (sans doute
parce que je n'ai pas l'habitude de lire cette syntaxe).
>> 2) comment afficher tous les sites qui appartiennent à un lien comme il
>> suit ?
>> - site_id
>> - site_id du distant
>
> premier cas: select * from site where id in (select id_src from lien
> where id lien = ?)
> union select * from site where id in (select id_trg from lien....)
Non, pour moi, ça liste tous les sites, mais pas le distant. Ça
correspond à ce que je faisais à la fin de mon post initial avec des
CREATE VIEW et UNION.
> deuxieme cas:
> select * from site where id in (select * id_site from lien_site where
> id_lien = ? )
Même remarque que précédemment et c'est justement ça mon problème,
lister tous les sites de la table de liaison, c'est facile mais faire la
liaison entre src et dst, je ne sais pas faire.
>> Autre chose : j'ai lu qu'il ne fallait pas stocker des informations que
>> l'on pouvait calculer. Il se trouve qu'il y des informations que je peux
>> calculer si je connais une extrémité ; par exemple, l'azimut (angle par
>> rapport au nord) est égal à celui du site distant + ou - 180°. La
>> fréquence est dite « haute » si celle d'en face est dite « basse ».
>
> en général, on parle d'attribut calculé:
>
> par exemple t'as la TVA, le HT et le TTC... stocker les 3 n'a pas de
> sens car à partir de 2 tu peux en recalculer un 3°...
>
> par contre, en effet, si tu prend l'état civil d'une personne, t'as
> sexe M/F sur un seul champ: tu vas pas dire qu'il faut pas stocker
> F parce que tu peux le déduire si t'as pas M....
Non, c'est différent, dans le cas de l'état civil, tu peux avoir soit
M ou F et tu n'as pas de contrainte. Si par contre tu prends un couple
(non homosexuel), c'est différent tu ne peux pas avoir deux M ou deux
F dans le même couple. Je veux éviter d'une part, d'avoir des
incohérences (deux bandes hautes dans le même lien, la somme des azimut
qui n'est pas égal à 360°), d'autre part de consommer de l'espace
lorsque ce n'est pas nécessaire. Je pense que seule la table à plat
(sans la table de liaison) me le permet.
> donc si t'as deux type de fréquence H/B... ben tu créé un champ et tu
> met la valeur qui va bien...
>
> si par contre t'as une règle qui dit si bande_de_frequence = ??? alors
> c'est bas... et que tu stocke la bande de fréquence, en effet, tu
> stocke pas la fréquence basse...
Il y a une fréquence basse et une fréquence haute dans la bande de
fréquence.
> au pire, si t'as des règles lourdes à coder et que tu veux éviter la
> redondances, tu peux utiliser des mécanismes de vues par exemple,
>> Avec toutes ces contraintes, j'en arrive à me dire qu'il est plus simple
>> de supprimer la table intermédiaire et d'avoir une table LIEN comme il
>> suit :
>> - lien_id
>> - bande de fréquence
>> - débit
>> - id_site_A
>> - antenne_A
>> - hauteur_A
>> - azimut_A
>> - fréquence_A
>> - id_site_B
>> - antenne_B
>> - hauteur_B
>
> oui, dépend de l'évolution de ton logiciel... tu va pas créer une
> table et plein de jointure pour 1 attributs... si a terme t'en a 10 la
> question se pose... si a terme t'as des connexion multiples aussi...
>
>> Bref, mon manque d'expérience m'empêche de savoir quelle solution
>> adopter. Pouvez-vous m'indiquer d'une part si ces deux solutions sont
>> viables et d'autres part quels sont leurs avantages/inconvénients ?
>
> en l'état avec aussi peu de champs, les deux solutions sont correctes...
Il y en a bien plus, c'était juste pour l'exemple.
> la solution compliquées sera cependant plus évolutive dans le temps...
C'est ce qui me semble aussi.
> dans tous les cas, tu peux utiliser des vues (j'ai le terme "requete
> nommées") pour simplifier un certain nombre de requetes...
>
> d'ailleurs, si tu base tout sur ces vues (sauf insert/delete/update),
> tu pourras plus facilement faire évoluer ton schéma sans trop impacter
> le reste de l'application ultérieurement....
Ok, merci pour la réponse.
--
Benoit Izac