PkLab.Net - Ingegneria Informatica e Automatica
Italiano English

Firebird: Tree data mangement

Last update: 05/01/2011 - Viewed: 4660 dal 05 Jan 2011
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...

    Keywords: SQL, FireBird
    Categories: Software developing
    Vote this page
    0    1    2    3    4    5   

    Leave your comment:

    Name:

    Email:

    Emails will not be visible or used in any way, and are not required

    Comment:


    Verify code:


    Type the code you can see here on the left
     

    Note:
  • Please keep comments relevant
  • Any content deemed inappropriate or offensive may be edited and/or deleted
  • No HTML code is allowed. Please use BBCode to format your text
  • URLs, complete of "http://" o "mailto:" , will be auto-linked
  • Nota: questo materiale è di proprietà di Pk Lab ed è utilizzabile liberamente a condizione di citarne la fonte
    [Privacy] [Termini e condizioni] [Home Page]  [Search]
    Copyright PkLab (c) 2009
    Contatto: - P.Iva: 01219980776