Next Previous Contents

29. Documentazione e libri di riferimento

29.1 Manuali e guide per l'utente

La documentazione che segue è inclusa nella distribuzione di PostgreSQL, nei formati postscript, HTML, e "pagine man" di unix. È collocata nella directory /usr/doc/postgresql* . Se avete accesso ad internet, potete trovare questi documenti presso http://www.postgresql.org/docs e presso http://www.postgresql.org/users-lounge/docs.

29.2 Documentazione disponibile in linea

29.3 Libri di riferimento utili

Sono disponibili centinaia di altri titoli su SQL! Cercateli in una libreria.

29.4 Documenti delle specifiche SQL ANSI/ISO - SQL 1992, SQL 1998

I documenti delle specifiche ISO ANSI/ISO possono essere trovati presso i seguenti siti:

29.5 Sintassi di 1992 ANSI/ISO SQL

Vedere l' Appendice A di questo documento.

29.6 Sintassi di 1998 ANSI/ISO SQL

Le specifiche SQL 1998 (SQL 3) sono ancora in sviluppo. Vedere "Accesso attraverso mezzi Elettronici alla SQL3 Working Draft" in questo documento: SQL 1998

29.7 Tutorial su SQL per principianti

Vedere l' Appendice B di questo documento.

29.8 Estensioni temporali a SQL92

Questa directory contiene le specifiche per una estensione temporale del linguaggio SQL-92 standard. Questo nuovo linguaggio è denominato TSQL2.

Le specifiche del linguaggio qui citato costituiscono la versione finale del linguaggio.

La corrispondenza può essere diretta al Presidente del TSQL2 Language Design Committee, Richard T.Snodgrass, Department of Computer Science, University of Arizona, Tucson, AZ 85721,

Le affiliazioni, e gli indirizzi e-mail dei membri del TSQL2 Language Design Committee, possono essere trovati in una sezione separata, situata in coda alle specifiche del linguaggio. Il contenuto di questa directory è il seguente.

spec.dvi,.ps - Specifiche del Linguaggio TSQL2, pubblicate nel settembre 1994

bookspec.ps - Specifiche del Linguaggio TSQL2, come nel libro del TSQL2, pubblicate nel Settembre 1995 (Vedere più sotto).

sql3 - proposte di modifiche sottoposte ai comitati ANSI e ISO SQL3.

Esiste, inoltre, una raccolta di commenti, abbinati alle specifiche del linguaggio, che dibattono le decisioni relative al progetto, forniscono esempi, e considerano come il linguaggio possa essere implementato. Questi commenti sono stati proposti originariamente al TSQL2 Language Design Committee. Adesso hanno un altro uso: fornire esempi dei costrutti, motivare le tante decisioni prese durante la progettazione del linguaggio, e confrontare TSQL2 con i molti altri linguaggi proposti negli ultimi quindici anni. Si dovrebbe sottolineare che questi commenti non sono parte delle specifiche del linguaggio TSQL2, ma sono piuttosto un supplemento e un approfondimento delle stesse. Le specifiche del linguaggio sono le sole parole definitive su TSQL2.

I commenti, insieme alle specifiche del linguaggio, a svariati indici, ed altro materiale di supporto, sono stati pubblicati in un libro:

Snodgrass, R.T. redattore, The TSQL2 Temporal Query Language, Kluwer Academic Publishers, 1995, 674+xxiv pagine.

I commenti di valutazione, che sono presenti nel libro, sono in forma abbreviata; la forma integrale è contenuta nel file eval.ps, ospitato in questa directory.

Il file tl2tsql2.pl è un programma in linguaggio prolog; esso traduce dichiarazioni logiche, consentite dal TSQL2, in costrutti validi per lo stesso TSQL2. Questo programma è stato scritto da Michael Boehlen

Può essere contattato per ottenere un testo descrittivo di questa traduzione. Quella trattata è però una versione alquanto datata di quel programma. Versioni più recenti sono disponibili presso (i sistemi TimeDB e Tiger).

29.9 Parte 0 - Procurarsi documenti su SQL ISO/ANSI

Questo documento illustra come procurarsi (legalmente) una copia dello standard SQL-92, e come procurarsi una copia dell'ultima bozza di SQL3.

Lo standard è protetto da copyright: lo standard ANSI è detenuto da ANSI, mentre lo standard ISO è detenuto da ISO.

In realtà esistono due (2) standard SQL: una pubblicazione ANSI e una pubblicazione ISO. I due standard sono identici parola per parola, tranne che per alcune questioni banali come il titolo del documento, le intestazioni delle pagine, la frase "International Standard" contrapposta a "American Standard", e così via.

Acquistare lo standard SQL-92

Lo standard ISO, ISO/IEC 9075:1992, Information Technology - Database Languages - SQL, è attualmente (Marzo, 1993) disponibile alla vendita presso ANSI:

     American National Standards Institute
     1430 Broadway
     New York, NY 10018 (USA)
     Phone (sales): +1.212.642.4900
al costo di 230.00 $ USA. La versione ANSI, ANSI X3.135-1992, American National Standard for Information Systems - Database Language SQL, al momento della scrittura di questo documento, non era disponibile alla vendita, La disponibilità era attesa per il periodo tra la fine di marzo e l'inizio di maggio del 1993). Il costo previsto era di 225.00 $ USA.

Se acquistate entrambi i documenti da ANSI, avrete una maggiorazione del 7% (circa 9.10 $ USA). Le spedizioni all'estero costeranno sicuramente di più. ANSI richiede una copia stampata dell'ordine di acquisto; in alternativa, potete inviare un assegno bancario (in dollari USA ad una banca americana) che sarà sottoposto a controlli di validità e convertito in contanti prima di sbrigare l'ordine (esiste un'eccezione: se la vostra organizzazione è un'azienda membro dell'ANSI, ANSI stessa vi spedirà la documentazione ed invierà il conto alla vostra società).

Lo standard ISO è disponibile anche al di fuori degli USA presso le locali associazioni nazionali che sono membri sia di ISO (International Organization for Standardization), sia di IEC (International Electrotechnical Commission). Copie della lista di consociate nazionali, e dei loro indirizzi, sono disponibili presso ANSI o presso altre consociate nazionali. Sono disponibili anche presso ISO:

     International Organization for Standardization
     Central Secretariat
     1, rue de Varembi
     CH-1211 Genhve 20
     Switzerland
Se preferite ordinare lo standard in un modo più comodo e rapido, dovrete pagare per avere questo privilegio. Potete ordinare ISO/IEC 9075:1992, Information Technology - Database Languages - SQL, presso:
     Global Engineering Documents
     2805 McGaw Ave
     Irvine, CA 92714 (USA)
     USA
     Telefono (valido ovunque): +1.714.261.1455
     Telefono (valido solo negli USA): (800)854-7179
per un costo di 308.00 $ USA. Non so se siano incluse le spese postali, ma posso immaginare che la spedizione internazionale costi di più (come minimo). In questo modo vi invieranno tempestivamente un documento, ed accetteranno anche pagamenti con le più note carte di credito. La Global non ha ancora la versione ANSI, e non dà né l'indicazione di un prezzo, né una data per la disponibilità (anche se mi aspetto che sia disponibile entro poche settimane dopo la pubblicazione di ANSI, e ad un prezzo vicino a 300.00 $ USA).

Acquistare una copia di SQL3 Working Draft (la bozza di lavoro)

Potete acquistare una copia stampata della bozza di lavoro di SQL3, presso il Segretariato ANSI X3, CBEMA (Computer and Business Equipment Manufacturers Association). Il loro proposito, è quello di conservare la "più recente" versione della bozza di lavoro di SQL3, e di venderla ad un prezzo tra i 60.00 ed i 65.00 $ USA. Potete contattare CBEMA all'indirizzo:

     CBEMA, X3 Secretariat
     Attn: Lynn Barra
     1250 Eye St.
     Suite 200
     Washington, DC 20005 (USA)
Lynn Barra può essere raggiunta anche al numero di telefono +1.202.626.5738 per richiedere una copia, ma probabilmente il contatto via lettera è più gradito.

Accesso attraverso mezzi Elettronici alla SQL3 Working Draft

La versione più recente (al momento della redazione di questo documento) della bozza di lavoro (e tutte le sue Parti) di SQL3 (ANSI e ISO), è disponibile presso

     gatekeeper.dec.com

  nella directory

     /pub/standards/sql/
In questa directory ci sono numerosi file. Ci sono file in formato PostScript. ed in formato "testo puro" (non gradevolmente formattato, ma leggibile a video senza software particolare).

In generale, potete trovare file con nomi come:

     sql-bindings-mar94.ps
     sql-bindings-mar94.txt
     sql-cli-mar94.ps
     sql-cli-mar94.txt
     sql-foundation-mar94.ps
     sql-foundation-mar94.txt
     sql-framework-mar94.ps
     sql-framework-mar94.txt
     sql-psm-mar94.ps
     sql-psm-mar94.txt
Quando verrà prodotta una nuova versione dei documenti, la stringa "mar94" cambierà per indicare la nuova data di pubblicazione (ad es., "aug94" è la data di nuova pubblicazione dopo "mar94").

In più, per quei lettori che non potessero ottenere un listato della directory a mezzo FTP, abbiamo posizionato un file di nome:

     ls
nella stessa directory. Questo file (che sorpresa!) contiene un listato del contenuto della directory.

Reperire file usando FTP diretto

Questo è un esempio di come usare FTP. In particolare, viene mostrato come connettersi a gatekeeper.dec.com, come spostarsi nella directory in cui è ospitato il documento base, e come trasferire il documento al vostro nodo. Notate che il vostro nodo deve avere accesso ad Internet per fare quanto sarà detto. Il nome di login è 'ftp', e la password è il vostro indirizzo email (a questa modalità ci si riferisce spesso come quella di "anonymous ftp" o "ftp anonimo"). Il comando 'type binary' è usato per assicurarci che nessun bit venga rimosso dai file ricevuti. Il comando 'get' trasferisce un file alla volta. Nello script che segue, i commenti sono racchiusi nei simboli < e > .

  % ftp gatekeeper.dec.com
  Connected to gatekeeper.dec.com.
  220- *** /etc/motd.ftp ***
       Gatekeeper.DEC.COM is an unsupported service of DEC Corporate Research.
       <... ora si potrebbe dover attendere...>
  220 gatekeeper.dec.com FTP server (Version 5.83 Sat ... 1992) ready.
  Name (gatekeeper.dec.com:<il vostro nome-login>): ftp  <va bene anche l'ftp anonimo>
  331 Guest login ok, send ident as password.
  Password: <inserite qui la vostra email >
  230 Guest login ok, access restrictions apply.
  Remote system type is UNIX.  <o qualsiasi altro>
  Using binary mode to transfer files.
  ftp> cd pub/standards/sql
  250 CWD command successful.
  ftp> dir
  200 PORT command successful.
  150 Opening ASCII mode data connection for /bin/ls.
  total 9529
  -r--r--r--  1 root     system     357782 Feb 25 10:18 x3h2-93-081.ps
  -r--r--r--  1 root     system     158782 Feb 25 10:19 x3h2-93-081.txt
  -r--r--r--  1 root     system     195202 Feb 25 10:20 x3h2-93-082.ps
  -r--r--r--  1 root     system      90900 Feb 25 10:20 x3h2-93-082.txt
  -r--r--r--  1 root     system    5856284 Feb 25 09:55 x3h2-93-091.ps
  -r--r--r--  1 root     system    3043687 Feb 25 09:57 x3h2-93-091.txt
  226 Transfer complete.
  ftp> type binary
  200 Type set to I.
  ftp> get x3h2-93-082.txt
  200 PORT command successful.
  150 Opening BINARY mode data connection for x3h2-93-082.txt (90900 bytes).
  226 Transfer complete.
  90900 bytes received in 0.53 seconds (166.11 Kbytes/s)
  ftp> quit
  % <il file è ora nella vostra directory col nome x3h2-93-082.txt>
Scaricare file senza supporto FTP diretto

Digital Equipment Corporation, al pari di molte altre compagnie, fornisce il servizio di ftp via email. La risposta può giungere dopo diversi giorni, ma il servizio fornito è equivalente al ftp, ed è per coloro che non hanno accesso diretto a ftp. L'indirizzo del server è:

ftpmail@decwrl.dec.com

Il seguente script permetterà di ottenere il file, in formato PostScript, relativo all'ultima versione del documento su SQL3:

     reply joe.programmatore@azienda-immaginaria.com
     connect gatekeeper.dec.com anonymous
     binary
     compress
     uuencode
     chdir /pub/standards/sql
     get x3h2-93-091.ps
     quit
La prima riga dello script istruisce il server ad inviarci i file richiesti; dovreste sostituire "joe.programmatore@azienda-immaginaria.com" col vostro indirizzo Internet. Il file di questo esempio, x3h2-93-091.ps, viene inviato in formato compresso (con "compress"), codificato (con "uuencode"), e suddiviso in 34 messaggi email separati. Se il vostro ambiente non fornisce strumenti per ricostruire file di questo tipo, potreste farvi inviare il file in forma di testo puro, con il seguente script:
     reply joe.programmatore@azienda-immaginaria.com
     connect gatekeeper.dec.com anonymous
     chdir /pub/standards/sql
     get x3h2-93-091.ps
     quit
Ma fate attenzione: il file .ps arriverà a voi suddiviso in più di 70 parti!

Per recuperare un file particolare qualsiasi, che non sia x3h2-93-091.ps, sostituite semplicemente "x3h2-93-091.ps" con il nome del file desiderato. Per ottenere una lista di tutti i file disponibili, sostituite " get x3h2-93-091.ps" con "dir".

29.10 Parte 1 - Stato attuale di SQL ISO/ANSI

Questo capitolo è una fonte di informazioni riguardanti il processo di standardizzazione di SQL, e del suo stato attuale.

Stato attuale:

Progetti di sviluppo sono attualmente in corso per migliorare SQL, rendendolo un linguaggio completo dal punto di vista computazionale, e per la definizione e la gestione di oggetti persistenti e complessi. Ciò comporta: la generalizzazione e la specializzazione delle gerarchie, l'eredità multipla, i tipi di dati definiti dall'utente, i trigger e le assertion, il supporto per i "knowledge based system", espressioni con interrogazioni ricorsive, e strumenti addizionali per l'amministrazione dei dati. Vanno considerati anche le specifiche dei tipi di dati astratti (ADT), degli identificatori di oggetti, dei metodi, dell'ereditarietà, del polimorfismo, dell'incapsulamento, e di tutte le altre caratteristiche normalmente associate alla gestione dei dati ad oggetti.

Nell'autunno 1996, diverse parti di SQL3 sono state votate dal CD ISO. Queste parti erano: SQL/Framework, SQL/Foundation, e SQL/Bindings. Queste votazioni fallirono (come ci si aspettava) con circa 900 commenti di critica. Alla fine di gennaio, si svolse un incontro di elaborazione ISO DBL, che produsse un vasto numero di soluzioni ai problemi che erano stati acclusi come commenti ai voti, o sottoposti come testi separati. Poiché l'incontro di elaborazione DBL non fu in grado di trattare tutti gli argomenti discussi nei commenti, l'incontro stesso venne esteso. Il completamento dell'incontro di elaborazione, è fissato per la fine di luglio del 1997, a Londra.

Esaminando l'incontro di elaborazione di luglio, ci si può aspettare che sarà richiesta una votazione finale del CD per le parti di SQL precedentemente accennate. Il processo del CD Finale impiegherà circa 6 mesi, e richiederà un incontro elaborativo DBL; dopodiché ci sarà una votazione DIS ed una rapidissima votazione IS.

Le procedure ISO sono cambiate rispetto a quelle che hanno determinato SQL/92; per questo i comitati SQL sono ancora impegnati nello studio dei dettagli della procedura stessa.

Se tutto andrà bene, queste parti di SQL3 diverranno ufficialmente standard ISO/IEC alla fine del 1998, ma i tempi sono molto stretti.

Nel 1993, i comitati di sviluppo ANSI e ISO decisero di scindere lo sviluppo del futuro SQL in uno standard, composto di molte parti. Esse sono:

Negli USA, la totalità di SQL3 viene trattata sia come progetto ANSI Domestico ("D"), sia come progetto ISO. Allo stato attuale, il completamento di SQL3 è atteso per il 1999.

Le Parti SQL/CLI e SQL/PSM sono in corso di elaborazione, come aggiuntive a SQL-92. Negli USA, queste caratteristiche vengono trattate solo come progetti Internazionali ("I"). SQL/CLI è stata completata nel 1995. SQL/PSM dovrebbe essere completata intorno alla fine del 1996.

Oltre al lavoro su SQL3, numerosi altri progetti sono in corso:

Comitato degli Standard e Procedimento

In tutto il mondo, i comitati per gli standard SQL sono sorprendentemente numerosi. Esiste un gruppo per gli standard internazionali SQL, ed è parte di ISO. Moltissimi paesi hanno comitati che si occupano specificatamente di SQL. Questi paesi (solitamente) inviano le loro rappresentative ai convegni ISO/IEC JTC1/SC 21/WG3 DBL. I paesi che partecipano attivamente alle procedure, per definire gli standard SQL ISO, sono:

Convalida NIST

Le implementazioni di SQL sono convalidate (negli USA) dal National Institute of Standards and Training (NIST). Attualmente il NIST si serve di una suite di prova per nuovi prodotti SQL-92. I dettagli esatti dei requisiti, per la convalida del NIST, vengono definiti nel Federal Information Processing Standard (FIPS). I requisiti attuali per SQL sono definiti nel FIPS 127-2. Le versioni nei formati Postscript e testo di questo documento, possono essere reperite presso il NIST. L'attuale Lista di Prodotti SQL Convalidati può essere ottenuta dal NIST.

Pubblicazioni di SQL Standard e articoli

Esistono due versioni dello standard SQL. Entrambe sono disponibili presso ANSI:

Le due versioni dello standard SQL sono identiche, tranne che per le intestazioni ed i riferimenti ad altri standard. Entrambe sono reperibili presso:

     American National Standards Institute
     1430 Broadway
     New York, NY 10018
     USA
     Phone (sales): +1.212.642.4900
Oltre allo standard SQL-92, ora c'è un Technical Corrigendum (correzione dei bug):
   * Technical Corrigendum 1:1994 to ISO/IEC 9075:1992
TC 1 dovrebbe essere reso disponibile da ANSI. C'è solo una versione ISO di TC 1 -- Si applica sia alla versione ANSI che a quella ISO di SQL-92.

Oltre ai testi base, svariati libri sono stati scritti sullo standard SQL 1992. Questi libri forniscono una descrizione dello standard assai più comprensibile dei testi ufficiali veri e propri.

Standard Correlati

Numerosi altri standard sono oggetto di interesse per la comunità SQL. Questa sezione contiene alcuni puntatori alle informazioni su queste realizzazioni. Questi puntatori aumenteranno di numero, man mano che le informazioni aggiuntive diventeranno disponibili sul web.

29.11 Parte 2 - Foundation - Fondamenti di SQL ISO/ANSI

Una quota significativa, nella realizzazione di SQL3, è quella del Documento dei Fondamenti di SQL:

Ci sono diversi prerequisiti per le funzionalità orientate agli oggetti:

Queste funzionalità sono definite come parti di SQL/PSM

Gran parte del lavoro, viene attualmente svolta per affinare il modello a oggetti di SQL-3, e per allinearlo con il modello ad oggetti proposto da ODMG. Questo lavoro è descritto nel documento X3H2 e ISO DBL: "Accomodating SQL3 and ODMG". Esiste anche un recente aggiornamento sull'operazione di Merge (fusione) SQL3/OQL.

Tempi di lavoro di SQL3

Lo sviluppo di SQL3 è sulla buona strada, ma gli standard finali saranno pronti fra anni.

La versione ANSI dello standard avrà scadenze simili.

29.12 Parte 3 - Interfaccia ISO/ANSI SQL a livello di chiamata (Call Level Interface)

SQL/CLI è un'interfaccia a livello di chiamata ai database SQL. È progettata per agevolare l'accesso al database da parte di applicazioni "shrink-wrapped". La CLI è stata originariamente creata da un sottocomitato di SQL Access Group (SAG). Le specifiche SAG/CLI sono state pubblicate come le specifiche di Microsoft Open DataBase Connectivity (ODBC) del 1992. Nel 1993, il SAG sottomise la CLI ai comitati SQL ANSI e ISO SQL (ora SQL Access Group si è fuso con il consorzio X/Open).

SQL/CLI fornisce uno standard internazionale per:

Tempi di lavoro di SQL/CLI

Per essere un procedimento di standardizzazione, quello di SQL/CLI è stato realizzato in tempi rapidissimi.

29.13 Parte 4 - Persistent stored modules (moduli memorizzati persistenti) SQL ISO/ANSI

SQL/PSM estende SQL aggiungendo:

Oltre ad essere un valido strumento di sviluppo di applicazioni, SQL/PSM fornisce il supporto fondamentale per le funzionalità orientate agli oggetti in SQL3.

Istruzioni multiple e stored procedure

Le istruzioni multiple e le stored procedure, offrono una varietà di vantaggi in ambiente client/server:

Estensioni di linguaggio procedurale

Il linguaggio procedurale aggiunge a SQL la potenza di un tradizionale linguaggio di programmazione, attraverso istruzioni per il controllo del flusso, ed una varietà di altri costrutti di programmazione.

Istruzioni per il controllo di Flusso

Le estensioni di linguaggio procedurale comprendono anche altri costrutti:

Inoltre, tutte le tradizionali istruzioni SQL possono essere incluse nelle procedure con istruzioni multiple.

Procedure esterne e chiamate di funzione

Esiste una funzionalità spesso citata tra quelle desiderate per molti database, ed implementate in qualcuno. Essa è la capacità di poter aggiungere, alle funzionalità interne, altre funzionalità, mediante chiamate a procedure scritte dall'utente, esterne al software del database stesso.

Il beneficio di queste capacità, è che permettono ad un database (e quindi anche alle applicazioni database) di poter usare un grande insieme di procedure e funzioni, troppo numerose per essere definite da un comitato per gli standard.

Tempi di sviluppo di SQL/PSM

SQL/PSM sta procedendo rapidamente:

29.14 Parte 5 - ISO/ANSI SQL/Binding

Per facilità di consultazione i binding con i linguaggi di programmazione, sono stati stralciati in un documento a parte. L'attuale versione è semplicemente un estratto dei binding incorporati e dinamici, tratti da SQL-92.

Svariate questioni, riguardanti i binding con i linguaggi di programmazione, rimangono irrisolte.

Per linguaggi di programmazione tradizionali, esiste la mappatura dei tipi di dati per SQL-92. Comunque, deve essere definita una mappatura tra gli oggetti SQL e le variabili del linguaggio di programmazione.

Nel caso dei linguaggi orientati agli oggetti, deve essere definita una mappatura per i tipi di dati SQL attuali, e tra il modello ad oggetti SQL ed il modello ad oggetti del linguaggio orientato agli oggetti.

Il modello ad oggetti deve essere reso stabile prima di essere utilizzato.

I binding coi linguaggi saranno completati come parte di SQL3.

29.15 Parte 6 - ISO/ANSI SQL XA Interface Specialization (SQL/XA)

Queste specifiche vorrebbero standardizzare un'interfaccia ai programmi applicativi (API), tra un Gestore di Transazione globale ed un Gestore di Risorse SQL. Sono volte a standardizzare le chiamate di funzione, basate sulle semantiche di ISO/IEC 10026, "Distributed Transaction Processing", che un Gestore di Risorse SQL dovrebbe poter supportare per commit in due fasi. Il documento base è derivato da una pubblicazione X/Open, con il permesso di X/Open, che specifica esplicitamente i parametri e le semantiche di input ed output, in termini dei tipi di dati SQL, per le seguenti funzioni: xa_close, xa_commit, xa_complete, xa_end, xa_forget, xa_open, xa_prepare, xa_recover, xa_rollback, e xa_start.

Attualmente ISO sta tentando di effettuare il fast-track delle specifiche X/Open XA. Il processo di fast-track porta ad adottare specifiche industriali attualmente in uso senza apporre cambiamenti. Le votazioni relative al fast-track di XA al ISO SC21, livello JTC 1, sono iniziate il 27 aprile, 1995, e termineranno il 27 ottobre 1995. Se le specifiche XA verranno approvate dal 75% dei votanti, e dai 2/3 dei membri di JTC 1, diverranno uno Standard Internazionale. Se la votazione sul fast-track sarà approvata, SQL/XA potrebbe diventare uno standard nel 1996.

29.16 Parte 7 - ISO/ANSI SQL Temporal

SQL Temporal riguarda i dati correlati con il tempo. Il concetto alla base, è l'utilità di effettuare interrogazioni dei dati per conoscere come erano in un momento particolare. SQL Temporal è raccolto in un testo di Rick Snodgrass, datato dicembre 1994, in cui sono descritti i concetti.

X3 Dichiara l'Approvazione di un Nuovo Progetto, ISO/IEC 9075 Parte 7: SQL/Temporal è un comunicato-stampa relativo a SQL/Temporal.

----------------------------------------------------------------------------
                                Temporal SQL
                                ************
Rick Snodgrass (presidente del comitato TSQL2)
31-Dic-1994
Diverse persone hanno contestato la necessità del supporto addizionale per il tempo in SQL3 (come proposto da DBL RIO-75, che ha richiesto una nuova parte di SQL per supportare i database temporali). Si sostiene che i tipi di dati astratti (ADT) siano sufficienti per il supporto temporale. In questo articolo informativo sostengo, usando esempi concreti, che usare colonne definite con tipi di dati astratti, per interrogazioni temporali, è una soluzione inadeguata. In particolare, molte ordinarie interrogazioni temporali sono difficili da simulare in SQL, oppure richiedono l'incorporazione di SQL in un linguaggio procedurale. In TSQL2, un'estensione temporale di SQL-92, sono state proposte delle alternative.

INTRODUZIONE

Il supporto del tempo di validità surclassa quello di un ADT temporale. Secondo quest'ultimo, una colonna è specificata come parte di un dominio temporale, come DATE o INTERVAL (più avanti verranno forniti brevi esempi). Con la gestione del tempo di validità, le righe di una tabella variano nel tempo, al variare della realtà. Il timestamp associato ad una riga di una tabella con tempo di validità, è interpretato, dal linguaggio di interrogazione, come quel momento in cui la combinazione dei valori delle colonne nella riga era valida. Questo timestamp implicito permette di esprimere le interrogazioni in modo succinto ed intuitivo.

UN CASO DI STUDIO - ARCHIVIARE LE INFORMAZIONI CORRENTI

L'Ufficio Personale (UP) dell'Università dell'Arizona ha archiviato alcune informazioni in un database, tra cui il nome di ogni impiegato, il suo attuale salario, ed il suo attuale titolo. Ciò può essere rappresentato per mezzo di una semplice tabella.

        Impiegato(Nome, Salario, Titolo)
Data questa tabella, trovare il salario di un impiegato è facile.
        SELECT Salario
        FROM Impiegato
        WHERE Nome = 'Bob'
Adesso l'UP desidera registrare la data di nascita. Per fare ciò, viene aggiunta una colonna alla tabella, producendo il seguente schema.
        Impiegato(Nome, Salario, Titolo, DatadiNascita DATE)
Trovare la data di nascita dell'impiegato è analogo al determinarne il salario.
        SELECT DatadiNascita
        FROM Impiegato
        WHERE Nome = 'Bob'

UN CASO DI STUDIO - ARCHIVIARE INFORMAZIONI STORICHE

L'UP desidera gestire, via computer, l'archivio storico dei dipendenti dell'ufficio. Per farlo vengono aggiunte due colonne: la prima indica quando l'informazione della riga diventa valida, mentre l'altra indica quando l'informazione non è più valida.

Impiegato (Nome, Salario, Titolo, DatadiNascita, Inizio DATE, Fine DATE)

Secondo il modello dei dati, queste nuove colonne sono identiche a DatadiNascita. Tuttavia, la loro presenza ha conseguenze a largo raggio.

UN CASO DI STUDIO - PROIEZIONE

Per trovare il salario attuale di un impiegato, le cose si fanno più difficili.

        SELECT Salario
        FROM Impiegato
        WHERE Nome = 'Bob' AND Inizio <= CURRENT_DATE AND CURRENT_DATE <= Fine
Questa query è più complicata della precedente. Le indiziate sono, ovviamente, le due nuove colonne. L'UP vuole fornire, ad ogni impiegato, la cronistoria del proprio salario. In particolare, devono essere determinati gli intervalli massimali per ogni salario. Sfortunatamente, questo non è possibile in SQL. Un impiegato potrebbe avere mutato il proprio titolo, pur mantenendo fisso il valore del salario.
Nome    Salario Titolo             DatadiNascita Inizio          Fine
----    ------- ------             ------------- ------          ----
Bob     60000   Assistente Rettore 1945-04-09    1993-01-01      1993-05-30
Bob     70000   Assistente Rettore 1945-04-09    1993-06-01      1993-09-30
Bob     70000   Rettore            1945-04-09    1993-10-01      1994-01-31
Bob     70000   Professore         1945-04-09    1994-02-01      1994-12-31


                               Figura 1
Notate che ci sono tre righe in cui il salario di Bob è rimasto costante a 70'000 $. Ne segue che il risultato dovrebbe essere di due righe per Bob.
Nome    Salario Inizio          Fine
----    ------- ------          ----
Bob     60000   1993-01-01      1993-05-30
Bob     70000   1993-06-01      1994-12-31
Un'alternativa è quella di fornire all'utente un estratto delle informazioni Salario e Titolo, così che egli possa determinare da sé quando il suo salario sia cambiato. Questa alternativa non è molto attraente, e neanche pratica. Una seconda alternativa è quella di usare SQL fin quando possibile.
CREATE TABLE Temp(Salario, Inizio, Fine)
AS      SELECT Salario, Inizio, Fine
        FROM Impiegato;
ripetete
        UPDATE Temp T1
        SET (T1.Fine) = (SELECT MAX(T2.Fine)
                         FROM Temp AS T2
                         WHERE T1.Salario = T2.Salario AND T1.Inizio < T2.Inizio
                                AND T1.Fine >= T2.Inizio AND T1.Fine < T2.Fine)
        WHERE EXISTS (SELECT *
                      FROM Temp AS T2
                      WHERE T1.Salario = T2.Salario AND T1.Inizio < T2.Inizio
                                AND T1.Fine >= T2.Inizio AND T1.Fine < T2.Fine)
finché più nessuna riga viene aggiornata;

DELETE FROM Temp T1

WHERE EXISTS (SELECT *
              FROM Temp AS T2
              WHERE T1.Salario = T2.Salario
                        AND ((T1.Inizio > T2.Inizio AND T1.Fine <= T2.Fine)
                        OR (T1.Inizio >= T2.Inizio AND T1.Fine < T2.Fine))
Il ciclo trova quegli intervalli che si sovrappongono o sono adiacenti, e che quindi dovrebbero essere fusi. Nella peggiore delle ipotesi, il ciclo viene eseguito log N volte, dove N è il numero di righe comprese in una serie di sovrapposizioni o di adiacenze. Il lettore può simulare l'interrogazione sulla tabella d'esempio, per convincersi della sua correttezza.

Una terza alternativa è quella di usare SQL solo per aprire un cursore sulla tabella. Viene mantenuta una lista collegata di periodi, ognuno di essi associato ad un salario. Questa lista collegata dovrebbe essere inizializzata come lista vuota.

DECLARE emp_cursor CURSOR FOR
        SELECT Salario, Titolo, Inizio, Fine
        FROM Impiegato;
OPEN emp_cursor;
ciclo:
FETCH emp_cursor INTO :salario, :inizio, :fine;
        se nessun-dato restituito goto finito;
        trova posizione in lista collegata per inserire quest'informazione;
        goto ciclo;
finito:
CLOSE emp_cursor;
itera attraverso la lista collegata, stampando date e salari

In questo caso, la lista collegata potrebbe non essere necessaria, se il cursore è realizzato con ORDER BY Inizio.

In ogni caso l'interrogazione, anche la più semplice, è piuttosto difficile da esprimere usando le funzionalità presenti in SQL-92. L'interrogazione è banale in TSQL2.

        SELECT Salario
        FROM Impiegato

UN CASO DI STUDIO - JOIN

Un approccio più drastico è quello di evitare il problema dell'estrazione della cronistoria del salario, riorganizzando lo schema per separare le informazioni di salario, titolo, e data di nascita (in seguito ignoreremo la data di nascita, per semplicità).

        Impiegato1 (Nome, Salario, DATA Inizio, DATA Fine)
        Impiegato2 (Nome, Titolo, DATA Inizio, DATA Fine)
La tabella dell'Impiegato1 è la seguente.
Nome    Salario Inizio          Fine
----    ------- ------          ----
Bob     60000   1993-01-01      1993-05-30
Bob     70000   1993-06-01      1993-12-31
Segue la tabella d'esempio Impiegato2.
Nome    Titolo                  Inizio          Fine
----    ------                  ------          ----
Bob     Assistente Rettore      1993-01-01      1993-09-30
Bob     Rettore                 1993-10-01      1994-01-31
Bob     Professore              1994-02-01      1994-12-31
Ora, con questa variazione, è facile ottenere l'informazione del salario di un impiegato.
        SELECT Salario, Inizio, Fine
        FROM Impiegato1
        WHERE Nome = 'Bob'
Ma che fare se l'Ufficio Personale volesse una tabella che contenga intervalli di salario e titoli ? (cioè, supponete che l'UP voglia una tabella simile a quella in Figura 1) Una possibilità è quella di stampare due tabelle, lasciando all'utente l'onere di immaginare le giuste combinazioni. Una seconda alternativa è quella di usare esclusivamente SQL. Sfortunatamente, quest'interrogazione deve riguardare un caso d'analisi relativamente a come ogni riga di Impiegato1 si sovrappone ad ogni riga di Impiegato2; sono possibili quattro casi.
SELECT Impiegato1.Nome, Salario, Dipartimento, Impiegato1.Inizio, Impiegato1.Fine
FROM Impiegato1, Impiegato2
WHERE Impiegato1.Nome = Impiegato2.Nome
     AND Impiegato2.Inizio <= Impiegato1.Inizio AND Impiegato1.Fine < Impiegato2.Fine
UNION
SELECT Impiegato1.Nome, Salario, Dipartimento, Impiegato1.Inizio, Impiegato2.Fine
FROM Impiegato1, Impiegato2
WHERE Impiegato1.Nome = Impiegato2.Nome
     AND Impiegato1.Inizio >= Impiegato2.Inizio AND Impiegato2.Fine < Impiegato1.Fine
        AND Impiegato1.Inizio < Impiegato2.Fine
UNION
SELECT Impiegato1.Nome, Salario, Dipartimento, Impiegato2.Inizio, Impiegato1.Fine
FROM Impiegato1, Impiegato2
WHERE Impiegato1.Nome = Impiegato2.Nome
     AND Impiegato2.Inizio > Impiegato1.Inizio AND Impiegato1.Fine < Impiegato2.Fine
        AND Impiegato2.Inizio < Impiegato1.Fine
UNION
SELECT Impiegato1.Nome, Salario, Dipartimento, Impiegato2.Inizio, Impiegato2.Fine
FROM Impiegato1, Impiegato2
WHERE Impiegato1.Nome = Impiegato2.Nome
     AND Impiegato2.Inizio > Impiegato1.Inizio AND Impiegato2.Fine  < Impiegato1.Fine
Ottenere tutti i casi giusti è un compito arduo. In TSQL2, effettuando una join temporale, si ottiene proprio quanto ci si attende.
        SELECT Impiegato1.Nome, Salario, Dipartimento
        FROM Impiegato1, Impiegato2
        WHERE Impiegato1.Nome = Impiegato2.Nome

UN CASO DI STUDIO - FUNZIONI AGGREGATE

La prossima richiesta dell'Ufficio Personale è: qual è il salario massimo? Prima di aggiungere il tempo, ciò era facile.

        SELECT MAX(Salario)
        FROM Impiegato
Ora, dal momento che è stata archiviata la cronistoria del salario, vorremmo una cronistoria del massimo salario. Il problema, naturalmente, è che SQL non fornisce funzioni aggregate temporali. Il modo facile per farlo è quello di stampare l'informazione, e scorrerla manualmente alla ricerca dei massimi. Un'alternativa più scaltra è quella di convertire l'interrogazione istantanea aggregata in una non-aggregata, e poi convertire quest'ultima in un'interrogazione temporale. L'interrogazione non-aggregata trova quei salari per i quali non esiste un salario maggiore degli altri.
        SELECT Salario
        FROM Impiegato AS I1
        WHERE NOT EXISTS (SELECT *
                          FROM Impiegato AS I2
                          WHERE I2.Salario > I1.Salario)
Convertire questa query in un'interrogazione temporale non è affatto banale. Quella che segue è una delle strade possibili.
CREATE TABLE Temp (Salario, Inizio, Fine )
AS      SELECT Salario, Inizio, Fine
        FROM Impiegato;
INSERT INTO Temp
        SELECT T.Salario, T.Inizio, I.Inizio
        FROM Temp AS T, Impiegato AS I
        WHERE I.Inizio >= T.Inizio AND I.Inizio < T.Fine  AND I.Salario > T.Salario;
INSERT INTO Temp
        SELECT T.Salario, T.Fine , I.Fine
        FROM Temp AS T, Impiegato AS I
        WHERE I.Fine > T.Inizio AND I.Fine <= T.Fine AND I.Salario > T.Salario;
DELETE FROM Temp T
WHERE EXISTS (SELECT *
              FROM Impiegato AS I
              WHERE ((T.Inizio => I.Inizio AND T.Inizio < I.Fine )
                        OR (I.Inizio >= T.Inizio AND I.Inizio < T.Fine ))
                    AND I.Salario > T.Salario;
Seguendo questa strada creiamo una tabella ausiliaria. Aggiungiamo a questa tabella il minor periodo di una sottrazione di periodi, ed il maggior periodo di una sottrazione di periodi. Poi cancelliamo tutti i periodi che si sovrappongono a qualche riga definita dalla subquery, e in seguito utilizziamo la precedente interrogazione con l'espressione NOT EXISTS. Infine generiamo il periodo massimo a partire dalla tabella ausiliaria, e lo facciamo nello stesso modo in cui è stato calcolato in precedenza. Come si può immaginare, questo codice SQL è estremamente inefficiente da eseguire, viste le complesse interrogazioni nidificate con predicati irregolari.

Una terza possibilità è quella di impiegare il meno possibile SQL, e calcolare invece il desiderato valore massimo della cronistoria, servendosi dei cursori in un linguaggio ospite.

La query in TSQL2 è ancora una volta lineare ed intuitiva.

        SELECT MAX(Salario)
        FROM Impiegato

RIASSUNTO

I dati variabili nel tempo sono gestiti dalla maggior parte delle applicazioni database. Il supporto del tempo di validità è assente in SQL. Molte ordinarie interrogazioni temporali sono difficilmente simulabili in SQL, oppure richiedono l'incorporazione di SQL in un linguaggio procedurale, a causa della mancanza di supporto alle tabelle con tempo di validità nel modello di dati di SQL, e nei suoi costrutti interrogativi.

D'altra parte, abbiamo dimostrato come l'aggiunta del supporto del tempo di validità richieda poche variazioni all'implementazione del DBMS, e come possa semplificare in modo drammatico alcune interrogazioni e consentirne altre; abbiamo visto, inoltre, come ciò possa consentire ottimizzazioni delle strutture di archiviazione, dei metodi di indicizzazione, e delle strategie di ottimizzazione che possono produrre significativi miglioramenti delle prestazioni.

Con una nuova parte di SQL3, che gestisce la variazione nel tempo dell'informazione, possiamo iniziare a realizzare applicazioni mirate, consentendo a SQL3 di gestire i dati temporali in modo più accorto.

----------------------------------------------------------------------------
           Accredited Standards Committee* X3, Information Technology
NEWS RELEASE

Doc. No.:       PR/96-0002

Reply to:       Barbara Bennett presso bbennett@itic.nw.dc.us

             X3 Annuncia l'approvazione di un Nuovo Progetto, ISO/IEC

                         9075 Parte 7:  SQL/Temporal

Washington D.C., gennaio 1996
----------------------------------------------------------------------------
-- Accredited Standards Committee X3, Information Technology, annuncia l'approvazione di un nuovo progetto di Supporto a SQL/Temporal, ISO/IEC 9075 Parte 7, con il lavoro realizzato dal Technical Committee X3H2, Database. L'intenzione, di questa proposta di standard, è quella di stabilire una nuova Parte dello standard SQL3 in costruzione, e cioè la Parte 7, SQL Temporale, che vuole estendere il linguaggio SQL per fornire supporto all'archiviazione, estrazione, e manipolazione dei dati temporali in un ambiente di database SQL. Il prossimo meeting X3H2 è fissato per 11-14 marzo 1996 in Kansas.

Le richieste di informazioni, riguardo a questo progetto, dovrebbero essere inviate al

        Presidente di X3H2,
        Dr. Donald R. Deutsch,
        Sybase, Inc., Suite 800,
        6550 Rock Spring
        Drive, Bethesda, MD  20817.
        Email: deutsch@sybase.com.
Una primo giro di consultazioni, su possibili licenze e su altre questioni pertinenti (copyright, marchi), è in corso. Si prega di fornire le informazioni del caso al
        Segretariato X3 presso
        1250 Eye Street
        NW, Suite 200,
        Washington DC  20005.
        Email: x3sec@itic.nw.dc.us
        FAX:  (202)638-4922.

29.17 Parte 8 - ISO/ANSI SQL MULTIMEDIA (SQL/MM)

Un nuovo progetto di standardizzazione internazionale ISO/IEC, volto allo sviluppo di una libreria di classi SQL per applicazioni multimediali, è stato approvato agli inizi del 1993. Questa nuova attività di standardizzazione, denominata SQL Multimedia (SQL/MM), mira a stabilire l'insieme delle definizioni dei tipi di dati astratti (ADT) di SQL, usando gli strumenti per la specifica e l'invocazione degli ADT, i quali sono forniti dalle specifiche del costruendo SQL3. SQL/MM si propone di standardizzare librerie di classi ad uso di ambienti scientifici ed ingegneristici, e per elaborazione di documenti e di metodi per la gestione di oggetti multimediali come immagini, suoni, animazione, musica, e video. Verosimilmente SQL/MM fornirà, al linguaggio SQL, un collegamento agli oggetti multimediali definiti da altri organismi di standardizzazione JTC1 (ad es. SC18 per i documenti, SC24 per le immagini, e SC29 per fotografie e filmati).

Il Piano del Progetto di SQL/MM, indica che sarà uno standard composito, consistente di un certo numero di parti sviluppate indipendentemente. La Parte 1 sarà una struttura di base, che specifica come le altre parti devono essere realizzate. Ognuna delle altre parti sarà dedicata ad uno specifico pacchetto applicativo SQL. La seguente struttura delle Parti SQL/MM esiste dall'agosto 1994:

Esiste un certo numero di tentativi di standardizzazione nell'area delle Informazioni Spaziali e Geografiche:


Next Previous Contents