Italiano English

Firebird: Tree data mangement

Last update: 05/01/2011 - Viewed: 8132 dal 05 Jan 2011
Keywords: SQL, FireBird
Sezioni: None
Argomenti: Database
Translation for this document is not available or is not complete,
if you are intrested to receive information please write to

This document shown two different way for server side managment of Data Tree with Firebird. First method uses Recursive Common Table Expression. Second method uses Recursive Stored Procedure

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?

About this...

    The coding examples presented here are for illustration purposes only. The author takes no responsibility for end-user use
    This work is property of Pk Lab. You can use it for free but you must retain author's copyright