[gl-como] Mysql gestione sistema piramidale

Mpuppeteer mpuppetier@gmail.com
Mer 4 Mar 2015 10:44:00 CET


Brisa:

Trovo più semplice usa soluzione intermedia fra la tua e quella di diego
se il cliente decide di mantenere questa soluzione ( max 4 livelli ).

tabella 1 piramidi
id
id_user

tabella 2 user_piramidi

id_piramidi, id_user, id_parent_1, id_parent_2, id_parent_3, level

in modo tale da poter selezionare tutto con una query simile a questa:
select * from user_piramidi where id_piramidi = ( select id from piramidi
where id_user = 1) order by level asc;

Il problema rimangono le insert, ma con un po' di php e query giuste dovrei
farcela senza intoppare mysql nel caso il sito diventasse enorme.

Gianni carabelli:
XML è da escludere a priori perché non so' quanto possano diventare grosse
le piramidi.
LDAP : è da parecchio che non lo uso e  mi complicherei la vita :-)

Il giorno 4 marzo 2015 10:03, Mpuppeteer <mpuppetier@gmail.com> ha scritto:

>
> Il 04/mar/2015 09:14 "Riccardo Penco" <riccardo.penco@gmail.com> ha
> scritto:
>
> >
> > ciao,
> >
> > non so se può aiutarti ma con postgresql utilizzerei le recursive cte
> (non so però se mysql le ha):
> >
> > scrivo direttamente il codice sql perché faccio prima che provare a
> spiegare
> >
> > create table test
> > (
> > id int not null primary key,
> > parent_id int,
> > descr varchar(128) not null default ''
> > );
> >
> > insert into test (id, descr) select 1, 'root a';
> > insert into test (id, descr) select 2, 'root b';
> > insert into test (id, descr) select 3, 'root c';
> > insert into test (id, parent_id, descr) select 4, 1, 'lev 1 a1';
> > insert into test (id, parent_id, descr) select 5, 1, 'lev 1 a2';
> > insert into test (id, parent_id, descr) select 6, 1, 'lev 1 a3';
> > insert into test (id, parent_id, descr) select 7, 2, 'lev 1 b1';
> > insert into test (id, parent_id, descr) select 8, 2, 'lev 1 b2';
> > insert into test (id, parent_id, descr) select 9, 3, 'lev 1 c1';
> > insert into test (id, parent_id, descr) select 10, 3, 'lev 1 c2';
> > insert into test (id, parent_id, descr) select 11, 4, 'lev 2 a11';
> > insert into test (id, parent_id, descr) select 12, 11, 'lev 3 a111';
> > insert into test (id, parent_id, descr) select 13, 6, 'lev 2 a31';
> > insert into test (id, parent_id, descr) select 14, 6, 'lev 2 a32';
> > insert into test (id, parent_id, descr) select 15, 9, 'lev 2 c12';
> > insert into test (id, parent_id, descr) select 16, 14, 'lev 3 a31';
> > insert into test (id, parent_id, descr) select 17, 16, 'lev 4 a311';
> >
> > with recursive t(root_id, level, id, parent_id, descr) as
> > (
> >   select id as root_id, 0 as level, id, parent_id, descr from test where
> parent_id is null
> >
> >   union all
> >
> >   select t.root_id, t.level + 1 as level, test.id, test.parent_id,
> test.descr from t, test where test.parent_id = t.id
> > )
> > select *
> > from t
> > where root_id = 1
> > and level <= 2;      -- prendo tutti i 'figli' dell'id 1 fino al livello
> 2
> >
> > spero ti possa servire
> > ciao
> > riki
> >
> >
> >
> > Il giorno 3 marzo 2015 23:31, Francesco Angelo Brisa <fbrisa@gmail.com>
> ha scritto:
> >
> >> Effettivamente, se nemmeno chi ti ha proposto il lavoro ha le idee
> chiare allora, si generico !
> >>
> >> Una sola tabella:
> >> id, parent, livello, PR, altri campi.....
> >>
> >> per semplificare le query consiglio di fare qualche vista o meglio
> ancora una tabelle che si aggiorna da triggers con l'lenco di tutti i
> figli, nipoti etc... di un nodo.
> >>
> >>
> >> tabella:
> >> parent, figlio
> >>
> >> dove la coppia "parent + figlio" sono univoche
> >>
> >> in questo modo con una semplice join hai tutti i figli di un padre.
> >>
> >>
> >> Il giorno 3 marzo 2015 20:52, Mpuppeteer <mpuppetier@gmail.com> ha
> scritto:
> >>
> >>>
> >>> Il giorno 3 marzo 2015 19:49, Diego Roversi <diegor@tiscali.it> ha
> scritto:
> >>>
> >>>> On Tue, 3 Mar 2015 16:26:50 +0100
> >>>> Mpuppeteer <mpuppetier@gmail.com> wrote:
> >>>>
> >>>> > Ciao ragazzi,
> >>>> > sono indeciso su come gestire un sistema piramidale a livello di
> database:
> >>>> >
> >>>> > L'idea è la classica tabella
> >>>> > id e parent_id, ma mi sembra complicato da gestire.
> >>>> >
> >>>>
> >>>> Oh cielo, i sistemi piramidali.
> >>>>
> >>>> Ad ogni modo gestire un sistema gerarchico in generale in sql, e
> quasi impossibile (se si usano solo query). Se usi un id_parent, ti serve
> comunque del codice che cicla e lancia svariate query per trovare i nodi
> figli. Se cerchi di farlo con un unica query, non se po' fa' ...
> >>>>
> >>>> Nel tuo caso hai una semplificazione non da poco, che e' quella che
> ti interessano un numero limitato di sotto livelli. Quindi al limite puoi
> creare una tabella con:
> >>>>
> >>>> id, id_parent_1, id_parent_2, id_parent_3, in cui specifichi il nodo
> di chi e' figlio, nipote, pronipote etc etc...
> >>>>
> >>>> --
> >>>> Diego Roversi <diegor@tiscali.it>
> >>>>
> >>>> --
> >>>> Mailing list info: http://lists.linux.it/listinfo/gl-como
> >>>
> >>>
> >>> Grazie Diego, infatti stavo rivedendo la cosa soprattutto per
> l'inserimento dei figli dei figli ecc...
> >>> con una funzione ricorsiva funziona, ma le query diventano parecchie.
> >>> La tua idea mi piace, sperimento e ti faccio sapere!
> >>>
> >>> Il problema vero e proprio è che nemmeno chi mi ha proposto il lavoro
> ha un'idea precisa su cosa vuole fare.. tanto per cambiare.
> >>>
> >>>
> >>>
> >>> --
> >>> Mailing list info: http://lists.linux.it/listinfo/gl-como
> >>>
> >>
> >>
> >>
> >> --
> >> Mailing list info: http://lists.linux.it/listinfo/gl-como
> >>
> >
> >
> >
> > --
> > Mailing list info: http://lists.linux.it/listinfo/gl-como
> >
> Grazie a tutti,
> sento il cliente gli chiedo esattamente cosa vuole, spiegandogli la
> situazione.
>
> Per le recursive cte che sappia io MySQL non le ha , ma si possono emulare
> con le  generic stored procedure... Se ho capito bene.
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.linux.it/pipermail/gl-como/attachments/20150304/d95ddb7a/attachment-0001.html>


Maggiori informazioni sulla lista gl-como