Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

10 réponses
Avatar
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

10 réponses

Avatar
Patrice
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" a écrit dans le 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






Avatar
Timur
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" a écrit dans le message de
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" a écrit dans le 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
>
>
>
>




Avatar
Patrice
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" a écrit dans le message de
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" a écrit dans le message de
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" a écrit dans le 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
> >
> >
> >
> >
>
>




Avatar
Timur
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" a écrit dans le message de
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" a écrit dans le message de
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" a écrit dans le message de
> 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" a écrit dans le


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




Avatar
synopsis
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" a écrit dans le 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






Avatar
Timur
J'ai vu cet article, mais cela ne répond pas à mon besoin.

Cordialement


--
Cordialement



"synopsis" a écrit dans le message de
news:438c5e90$0$7350$
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" a écrit dans le 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
>
>
>
>




Avatar
Med Bouchenafa
le modele relationnel n'est peut etre pas ce qu'il y a de plus adapte pour
ce genre de probleme.
Je ne sais pas quelle est la taille des donnees manipulees, mais
j'investiguerai bien la possibilite de tout travailler en memoire et de
serialiser le stockage sur n'importe support. Les algorithmes de listes
chainees en memoire sont tres elabores

--
Bien cordialement
Med Bouchenafa


"Timur" wrote in message
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






Avatar
Patrice
Je ne vois pas trop :
- soit on garde le principe de la liste chaînée et à ce moment la la table
sera difficile à parcourir/ordonner avec SQL Server : je ne vois guère qu'un
parcours manuel qui stocke les données dans une variable table avant de les
retourner ; les chemins sont ils volumineux ? on peut peut-être charger tout
le chemin et garder trace des modifs à la ADO.NET avant de les sauver ?
- soit on garde le principe SQL et alors il faut ordonner les lignes ce qui
pourrait donner

ID ORDRE LIB
1 100 sur la place...
2 200 continuer
3 300 tourner à gauche
4 400 tourner encore à gauche

On peut alors :
supprimer 2
insérer
5 110 A
6 120 B
etc...

Le bouclage pourrait peut-être implicite ? (à la fin de la liste c'est "vous
être revenu à votre point de départ" ?).

Bon courage.
----
Patrice

"Timur" a écrit dans le message de
news:
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" a écrit dans le message de
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" a écrit dans le message


de
> 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" a écrit dans le message de
> > 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" a écrit dans le
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
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Avatar
Fred BROUARD
Si !!!

En effet une liste chaînée est un arbre particulier : il n'a qu'un seul chemin :
branche continue.

De plus si vous le réalisez en intervalle de type float (si vous n'avez pas
beaucoup de valeurs) alors vous minimiserez les updates.

A +

Timur a écrit:
J'ai vu cet article, mais cela ne répond pas à mon besoin.

Cordialement





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Fred BROUARD
Plus qu'une liste chainée il s'agit d'un graphe orienté.

A +

Timur a écrit:
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.






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************