Italiano - English

Firebird: gestione di strutture ad albero

In queste pagine vengono presentati due metodi per la gestione lato server di strutture dati ad albero (padre/figlio) in Firebird. Il primo metodo l'utilizza le Common Table Expression (CTE) Ricorsive il secondo metodo utilizza una Stored Procedure Ricorsiva

Una classica struttura ad albero N- o Bayer dove ogni nodo ha 0..N figli, è molto comoda per organizzare e rappresentare i dati in modo gerarchico, tuttavia presenta alcune difficoltà quando deve essere memorizzata (e soprattutto reperite) in un database.

La via classica di attraversamento di un albero richiede la ricorsione che può essere eseguita sul client con grande facilità di programmazione ma con enormi ritardi e difficoltà se il collegamento client/server non è veloce e stabile. E' molto utile eseguire l'attraversamento ma soprattuto la ricorsione, sul server e ricevere sul client i dati gia organizzati.

Con Firebird come altri DBMS mettono a disposizione alcuni strumenti che possono essere utilizzati allo scopo, in queste pagine vengono presentati degli esempi pratici su come utilizzare le Common Table Expression ricorsive e le Stored Procedure per la gestione delle strutture ad albero.

Un Esempio pratico

Abbiamo una struttura ad albero con relazione padre/figlio come segue

  • GrandFather1,  Età:80
    • Son1, Età:60
      • GrandSon1, Eta 14
      • GrandSon2, Età 19
    • Son2, Età:58
 
CREATE TABLE FAMILY (
    ID           INTEGER NOT NULL ,
    IDFATHER     INTEGER DEFAULT NULL,
    NOME         VARCHAR(100),
    AGE           SMALLINT
);
 
/* Primary Keys*/
ALTER TABLE FAMILY ADD CONSTRAINT PK_FAMILY PRIMARY KEY (ID);
 
/* Foreign Keys*/
ALTER TABLE FAMILY ADD CONSTRAINT FK_FAMILY_1 FOREIGN KEY (IDFATHER)
REFERENCES FAMILY (ID) ON UPDATE CASCADE;
 

Il campo ID è la chiave primaria mentre il campo IDFATHER stabilisce la relazione padre/figlio sulla stessa tabella FAMILY.

Per completezza è bene definire un generatore ed un trigger per gestire una eventuale funzione di AutoInc sul campo ID. Allo scopo si consiglia di utilizzare la tecnica presentata in Firebird: A safe trigger for autoinc fields

Inseriamo i dati di esempio:

 
INSERT INTO FAMILY (ID, IDFATHER,NOME,AGE) VALUES (1,NULL,'GrandFather1',80);
INSERT INTO FAMILY (ID, IDFATHER,NOME,AGE) VALUES (2,1,'Son1',60);
INSERT INTO FAMILY (ID, IDFATHER,NOME,AGE) VALUES (3,1,'Son2',58);
INSERT INTO FAMILY (ID, IDFATHER,NOME,AGE) VALUES (4,2,'GrandSon1',14);
INSERT INTO FAMILY (ID, IDFATHER,NOME,AGE) VALUES (5,2,'GrandSon2',19);

A questo punto il problema è come interrogare e reperire le informazioni in modo gerarchico ovvero rispettando la struttura padre/figlio definita?

Vedi anche:

Firebird: gestione di strutture ad albero con CTE ricorsive

05-01-2011 16671 5

In questa pagina viene presentata la funzionalità ricorsiva delle Common Table Expression (CTE) di Firbird per gestire strutture ad albero (padre/figlio)

Firebird: gestione di strutture ad albero con Stored Procedure Ricorsive

05-01-2011 16637

In questa pagina viene presentata la funzionalità ricorsiva delle Stored Procedure di Firbird per gestire strutture ad albero (padre/figli)

Vota questa pagina:

0 Commenti:

Lascia il tuo commento:

Note:
  • La tua email non è obligatoria e non sarà visibile in alcun modo
  • Si prega di inviare solo commenti relativi a questa pagina
  • Commenti inappropriati o offensivi saranno modificati o eliminati
  • Codici HTML non sono consentiti. Prego usare i BB code:
    [b]bold[/b], [u]underline[/u], [i]italic[/i], [code]code[/code]
Il codice, le illustrazioni e gli esempi riportati in questa pagina sono solo a scopo illustrativo. L'autore non prende alcuna responsabilità per il loro utilizzo da parte dell'utente finale.
Questo materiale è di proprietà di Pk Lab ed è utilizzabile liberamente a condizione di citarne la fonte.