[Gfoss] Splite - Unione tabelle

a.furieri a lqt.it a.furieri a lqt.it
Mar 25 Mar 2014 14:28:31 CET


On Tue, 25 Mar 2014 13:52:33 +0100, pierluigi de rosa wrote:
> Ciao a tutti.
> Sto cercando di fare una cosa con splite ma non ho trovato ancora la
> soluzione.
> Ho un db che contiene dei layer-tavole esattamente uguali nella
> struttura e nelle geometrie.
> Vorrei creare una vista geometrica che me li vede tutti insieme
> automaticamente. Ovvero vorrei evitare di dare il nome delle tavole 
> ma
> che li leggesse da una metatabella che contiene i layer presenti nel
> db.
> Il tutto perché ho necessità di aggiungere layer al db nel corso del
> tempo ma mi serve una vista in grado di visualizzare tutti i layer
> come un unico strato informativo.
>

Ciao Pierluigi,

la prima parte del quesito e' molto facile da risolvere:

CREATE VIEW mescolone AS
SELECT "tavola1" AS origine, pippo AS a,
   pluto AS b, topolino AS c, geometry
FROM tavola1
UNION
SELECT "tavola2" AS origine, qui AS a,
   quo AS b, qua AS c, geometry
FROM tavola2
UNION
SELECT "tavola3" AS origine, alfa AS a,
   beta AS b, gamma AS c, geometry
FROM tavola3;

la seconda parte (cioe' pescare dinamicamente i nomi-tavola
da una metabella) direi che e' assolutamente fuori portata
di qualsiasi possibile implementazione "puro SQL".
eventualmente potresti pero' appoggiarti su qualche linguaggio
(p.es. python) per implemetare un piccolo script che:
- cancelli la versione precedente della vista
- ricostruisca ex-novo il codice di creazione della VIEW
   tutte le volte che cambi la meta-configurazione.
- ed infine vada a crearsi la nuova versione della VIEW


Avvertenze e precauzioni:
-------------------------
- aggiungere una colonna extra che tracci le origini in
   genere risulta abbastanza utile e comodo.
- la UNION elimina implicitamente tutti i doppioni; se
   vuoi essere sicuro di non perdere nessuna riga allora
   usa piuttosto la UNION ALL
- se stimi che le tue tavole cresceranno fino ad avere
   dimensioni pesantucce (milioni di righe) ti consiglio
   di comprarti una buona scorta di libri gialli, film
   divertenti e tanta buona musica .... perche' ogni volta
   che andrai a lanciare una query su quella View potrebbe
   anche impiegare tempi decisamente molte lunghi prima di
   decidersi a sfornare qualche risposta.

CAVEAT e contro-indicazioni:
----------------------------
- con una VIEW di questo tipo (basata su piu' tavole) perdi
   automaticamente qualsiasi possibilita' di utilizzare gli
   Spatial Index (il che contribuira' ulteriormente ad
   assicurare prestazioni sicuramente pessime).
- inoltre scordati di riuscire mai a leggere una View di
   questo tipo p.es. su QGIS, perche' uno dei requisiti
   imposti dal data-provider e' che la colonna geometrica
   della View sia direttamente riconducibile ad una singola
   colonna registrata in "geometry_columns"


Suggerimenti:
-------------
personalmente eviterei accuratamente di utilizzare le
View e peggio che peggio le Union (due bellissimi
meccanismi formali, molto stuzzicanti perche' danno
l'illusione apparente di risparmiare storage evitando
qualsiasi ridondanza, ma anche due performance-killer
di spaventosa efficienza).

preferirei piuttosto crearmi un unico "tavolone",
magari con una colonna extra utile per tracciare le
origini, e con un robusto Spatial Index di supporto
per garantire alta velocita' di elaborazione.

insomma, invertirei totalmente i termini del problema;
un unico layer monolitico, che ti assicura certamente
il top dell'efficienza e dell'uso ottimizzato dello
storage.
e che contemporaneamente ti continua a dare la possibilita'
di recuperare a piacere ciascun singolo sub-layer visto
che le origini verranno sempre scrupolosamente tracciate:
bastera' una banale query "... WHERE origine = 'pippo' ..."
per spacchettare a ritroso ciascuno dei layers elementari
qulora dovesse servire.

ciao Sandro




Maggiori informazioni sulla lista Gfoss