GNT sans publicité, site mobile, fonctionnalitées exclusives...

Problème de modélisation : liste chainée

Le
Timur
Bonjour,


j'ai un soucis de modélisation d'une base de données.

Je dois stocker une liste chainée dans laquelle

- je dois pouvoir facilement ajouter ou enlever un élément
- la chaîne n'a ni début ni fin : tous les élements ont un "élement suivant"
(on est plutôt sur un collier de perles !)
- je n'ai besoin de parcourir ma liste que dans un seul sens


J'ai bien pensé à une table (simplifiée bien sur)

ID int autoincrémenté
libElement varchar(100)
Next ID int

Cela me fait une insertion + 1 update à chaque insertion d'un nouvel élément
dans la chaîne.


Par contre, comment faire un ordre SQL qui réponde à la question "Je veux
les 200 élements suivant l'élement dont l'ID est xxx ?"

Je ne peux pas faire de récursivité vu le nombre d'éléments à retourner.


Un autre point. L'appli est développé sous SQL 2000, mais doit être portable
sous MySQL


Help !

--
Cordialement
Lire les 10 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Patrice
Le #11658951
En gros la liste chaînée permet de parcourir dans un ordre précis. Donc
peut-être une table avec un simple numéro d'ordre (avec des trous pour
pouvoir renuméroter uniquement si on a des collisions) ?

---
Patrice


"Timur" news:

Bonjour,


j'ai un soucis de modélisation d'une base de données.

Je dois stocker une liste chainée dans laquelle

- je dois pouvoir facilement ajouter ou enlever un élément
- la chaîne n'a ni début ni fin : tous les élements ont un "élement


suivant"
(on est plutôt sur un collier de perles !)
- je n'ai besoin de parcourir ma liste que dans un seul sens


J'ai bien pensé à une table (simplifiée bien sur)

ID int autoincrémenté
libElement varchar(100)
Next ID int

Cela me fait une insertion + 1 update à chaque insertion d'un nouvel


élément
dans la chaîne.


Par contre, comment faire un ordre SQL qui réponde à la question "Je veux
les 200 élements suivant l'élement dont l'ID est xxx ?"

Je ne peux pas faire de récursivité vu le nombre d'éléments à retourner.


Un autre point. L'appli est développé sous SQL 2000, mais doit être


portable
sous MySQL ...


Help !

--
Cordialement






Timur
Le #11658851
mouais ... :(((((((

j'avais bien pensé à cette solution, mais ça n'est pas terrible quand-même,
non ?

C'est pour une appli web, et je me vois mal renuméroter mes quelques
dizaines de milliers de lignes en temps réel !
Même une proc de maintenance le soir qui recrée les trous, c'est moyen !


En plus, cela suppose un début (no ordre le plus petit) et une fin (no ordre
le plus grand), ce qui n'a pas de sens dans mon appli (le plus grand
'pointe' sur le plus petit pour faire la boucle)



--
Cordialement


"Patrice" news:
En gros la liste chaînée permet de parcourir dans un ordre précis. Donc
peut-être une table avec un simple numéro d'ordre (avec des trous pour
pouvoir renuméroter uniquement si on a des collisions) ?

---
Patrice


"Timur" news:
>
> Bonjour,
>
>
> j'ai un soucis de modélisation d'une base de données.
>
> Je dois stocker une liste chainée dans laquelle
>
> - je dois pouvoir facilement ajouter ou enlever un élément
> - la chaîne n'a ni début ni fin : tous les élements ont un "élement
suivant"
> (on est plutôt sur un collier de perles !)
> - je n'ai besoin de parcourir ma liste que dans un seul sens
>
>
> J'ai bien pensé à une table (simplifiée bien sur)
>
> ID int autoincrémenté
> libElement varchar(100)
> Next ID int
>
> Cela me fait une insertion + 1 update à chaque insertion d'un nouvel
élément
> dans la chaîne.
>
>
> Par contre, comment faire un ordre SQL qui réponde à la question "Je


veux
> les 200 élements suivant l'élement dont l'ID est xxx ?"
>
> Je ne peux pas faire de récursivité vu le nombre d'éléments à retourner.
>
>
> Un autre point. L'appli est développé sous SQL 2000, mais doit être
portable
> sous MySQL ...
>
>
> Help !
>
> --
> Cordialement
>
>
>
>




Patrice
Le #11658841
Avec des trous suffisamment grand, une rénumération devrait être
exceptionnelle. Pour le rebouclage, tu peux éventuellement faire une autre
requête pour compléter si tu ne sélectionnes que les derniers
enregistrements.

Sinon explique peut-être la nature des données plus que la représentation
technique que tu as retenue et cela pourra peut-être faire germer de
nouvelles idées.

Pourquoi la liste chaînée est-elle circulaire ?

--
Patrice

"Timur" news:
mouais ... :(((((((

j'avais bien pensé à cette solution, mais ça n'est pas terrible


quand-même,
non ?

C'est pour une appli web, et je me vois mal renuméroter mes quelques
dizaines de milliers de lignes en temps réel !
Même une proc de maintenance le soir qui recrée les trous, c'est moyen !


En plus, cela suppose un début (no ordre le plus petit) et une fin (no


ordre
le plus grand), ce qui n'a pas de sens dans mon appli (le plus grand
'pointe' sur le plus petit pour faire la boucle)



--
Cordialement


"Patrice" news:
> En gros la liste chaînée permet de parcourir dans un ordre précis. Donc
> peut-être une table avec un simple numéro d'ordre (avec des trous pour
> pouvoir renuméroter uniquement si on a des collisions) ?
>
> ---
> Patrice
>
>
> "Timur"

de
> news:
> >
> > Bonjour,
> >
> >
> > j'ai un soucis de modélisation d'une base de données.
> >
> > Je dois stocker une liste chainée dans laquelle
> >
> > - je dois pouvoir facilement ajouter ou enlever un élément
> > - la chaîne n'a ni début ni fin : tous les élements ont un "élement
> suivant"
> > (on est plutôt sur un collier de perles !)
> > - je n'ai besoin de parcourir ma liste que dans un seul sens
> >
> >
> > J'ai bien pensé à une table (simplifiée bien sur)
> >
> > ID int autoincrémenté
> > libElement varchar(100)
> > Next ID int
> >
> > Cela me fait une insertion + 1 update à chaque insertion d'un nouvel
> élément
> > dans la chaîne.
> >
> >
> > Par contre, comment faire un ordre SQL qui réponde à la question "Je
veux
> > les 200 élements suivant l'élement dont l'ID est xxx ?"
> >
> > Je ne peux pas faire de récursivité vu le nombre d'éléments à


retourner.
> >
> >
> > Un autre point. L'appli est développé sous SQL 2000, mais doit être
> portable
> > sous MySQL ...
> >
> >
> > Help !
> >
> > --
> > Cordialement
> >
> >
> >
> >
>
>




Timur
Le #11658821
il s'agit de stocker des itinéraires pédestres en boucle dans une ville.

du style


ID LIB
IDNEXT
1 'sur la place xxx, prendre à gauche la rue YYY'
2
2 'Continuer tout droit sur 200 m'
3
3 'tourner à gauche'
4
4 'tourner encore à gauche'
1


Je peux avoir besoin de remplacer le ID 2 par plusieurs dizaines de lignes
permettant de passer par un autre chemin.



--
Cordialement



"Patrice" news:%23$
Avec des trous suffisamment grand, une rénumération devrait être
exceptionnelle. Pour le rebouclage, tu peux éventuellement faire une autre
requête pour compléter si tu ne sélectionnes que les derniers
enregistrements.

Sinon explique peut-être la nature des données plus que la représentation
technique que tu as retenue et cela pourra peut-être faire germer de
nouvelles idées.

Pourquoi la liste chaînée est-elle circulaire ?

--
Patrice

"Timur" news:
> mouais ... :(((((((
>
> j'avais bien pensé à cette solution, mais ça n'est pas terrible
quand-même,
> non ?
>
> C'est pour une appli web, et je me vois mal renuméroter mes quelques
> dizaines de milliers de lignes en temps réel !
> Même une proc de maintenance le soir qui recrée les trous, c'est moyen !
>
>
> En plus, cela suppose un début (no ordre le plus petit) et une fin (no
ordre
> le plus grand), ce qui n'a pas de sens dans mon appli (le plus grand
> 'pointe' sur le plus petit pour faire la boucle)
>
>
>
> --
> Cordialement
>
>
> "Patrice" > news:
> > En gros la liste chaînée permet de parcourir dans un ordre précis.


Donc
> > peut-être une table avec un simple numéro d'ordre (avec des trous pour
> > pouvoir renuméroter uniquement si on a des collisions) ?
> >
> > ---
> > Patrice
> >
> >
> > "Timur"

message
de
> > news:
> > >
> > > Bonjour,
> > >
> > >
> > > j'ai un soucis de modélisation d'une base de données.
> > >
> > > Je dois stocker une liste chainée dans laquelle
> > >
> > > - je dois pouvoir facilement ajouter ou enlever un élément
> > > - la chaîne n'a ni début ni fin : tous les élements ont un "élement
> > suivant"
> > > (on est plutôt sur un collier de perles !)
> > > - je n'ai besoin de parcourir ma liste que dans un seul sens
> > >
> > >
> > > J'ai bien pensé à une table (simplifiée bien sur)
> > >
> > > ID int autoincrémenté
> > > libElement varchar(100)
> > > Next ID int
> > >
> > > Cela me fait une insertion + 1 update à chaque insertion d'un nouvel
> > élément
> > > dans la chaîne.
> > >
> > >
> > > Par contre, comment faire un ordre SQL qui réponde à la question "Je
> veux
> > > les 200 élements suivant l'élement dont l'ID est xxx ?"
> > >
> > > Je ne peux pas faire de récursivité vu le nombre d'éléments à
retourner.
> > >
> > >
> > > Un autre point. L'appli est développé sous SQL 2000, mais doit être
> > portable
> > > sous MySQL ...
> > >
> > >
> > > Help !
> > >
> > > --
> > > Cordialement
> > >
> > >
> > >
> > >
> >
> >
>
>




synopsis
Le #11658801
Peut-être en essayant de modéliser par une représentation intervallaire

Excellent article de Fred Brouard sur :
http://sqlpro.developpez.com/cours/arborescence/

"Timur" news:

Bonjour,


j'ai un soucis de modélisation d'une base de données.

Je dois stocker une liste chainée dans laquelle

- je dois pouvoir facilement ajouter ou enlever un élément
- la chaîne n'a ni début ni fin : tous les élements ont un "élement
suivant"
(on est plutôt sur un collier de perles !)
- je n'ai besoin de parcourir ma liste que dans un seul sens


J'ai bien pensé à une table (simplifiée bien sur)

ID int autoincrémenté
libElement varchar(100)
Next ID int

Cela me fait une insertion + 1 update à chaque insertion d'un nouvel
élément
dans la chaîne.


Par contre, comment faire un ordre SQL qui réponde à la question "Je veux
les 200 élements suivant l'élement dont l'ID est xxx ?"

Je ne peux pas faire de récursivité vu le nombre d'éléments à retourner.


Un autre point. L'appli est développé sous SQL 2000, mais doit être
portable
sous MySQL ...


Help !

--
Cordialement






Publicité
Suivre les réponses
Poster une réponse
Anonyme