[an error occurred while processing this directive]
diff logo Informatica e sistemi alternativi
su questo sito sul Web
    Home   Chi siamo    Contattaci    Scrivi per diff    Proponi un argomento 28/03/24
    Cos'è diff    Come accedere    F.A.Q.    Promuovi    Dicono di diff    Amici di diff    
AmigaOS
Linux
FreeBSD
BeOS
OpenSource
Java
Database
Informatica
Hardware
E-Commerce
Narrativa

Appendice all'articolo
Il modello Entità - Relazioni di Giuseppe Sacco

Riletto in PostgreSQL
di Ferruccio Zamuner

Premettendo che il PostgreSQL 6.5 non ha ancora implementato le foreign keys, infatti per ora usa i trigger, ecco qui una traduzione in PostgreSQL delle pagine precedenti di questo articolo.

Il PostgreSQL supporta i seguenti tipi per il testo:
char, char(n), text, varchar(n)
ma si consiglia l'uso del tipo text che č ottimizzato per gestire qualsivoglia dimensione di stringa (nel limite degli 8K per record, altrimenti bisogna ricorrere ai Large Objects).

In PostgreSQL non esistono le procedure, o meglio sono chiamate funzioni (in virtų del fatto che č un Object-Relational Data Base System).

Ecco la sessione completa del dialogo con l'interprete psql del PostgreSQL.


bash-2.02$ psql arci
Welcome to the POSTGRESQL interactive sql monitor:
  Please read the file COPYRIGHT for copyright terms of POSTGRESQL
  [PostgreSQL 6.5.2 on i386-freebsd3.0, compiled by gcc 2.7.2.1]

  type \? for help on slash commands
  type \q to quit
  type \g or terminate with semicolon to execute query
  You are currently connected to the database: arci

ARCI=> CREATE TABLE Socio ( 
   tessera    INT4         CONSTRAINT pk_tessera PRIMARY KEY, 
   nome       TEXT   CONSTRAINT nn_nome    NOT NULL, 
   cognome    TEXT, 
   dataiscr   DATE           DEFAULT 'NOW', 
   datainizio DATE, 
   datafine   DATE);
ARCI->NOTICE:  CREATE TABLE/PRIMARY KEY will create implicit 
      index 'pk_tessera' for table 'socio'
CREATE
ARCI=> insert into Socio (tessera,nome,cognome) 
              values (99,'Giuseppe','Sacco');
INSERT 411218 1
[...]
ARCI=> select * from Socio;
tessera|nome     |cognome|  dataiscr|datainizio|datafine
-------+---------+-------+----------+----------+--------
    100|Ferruccio|Zamuner|10-12-1999|          |        
     99|Giuseppe |Sacco  |10-12-1999|          |        
(2 rows)

ARCI=> CREATE TABLE Squadra ( 
 nome     TEXT  CONSTRAINT pk_nome PRIMARY KEY, 
 portiere INT4  CONSTRAINT fk_portiere REFERENCES Socio(tessera), 
 difdx    INT4  CONSTRAINT fk_difdx    REFERENCES Socio(tessera), 
 difsx    INT4  CONSTRAINT fk_difsx    REFERENCES Socio(tessera), 
 attdx    INT4  CONSTRAINT fk_attdx    REFERENCES Socio(tessera), 
 attsx    INT4  CONSTRAINT fk_attsx    REFERENCES Socio(tessera));
ARCI-> NOTICE:  CREATE TABLE/FOREIGN KEY clause ignored; 
                not yet implemented
NOTICE:  CREATE TABLE/FOREIGN KEY clause ignored; 
                not yet implemented
NOTICE:  CREATE TABLE/FOREIGN KEY clause ignored;
                not yet implemented
NOTICE:  CREATE TABLE/FOREIGN KEY clause ignored;
                not yet implemented
NOTICE:  CREATE TABLE/FOREIGN KEY clause ignored;
                not yet implemented
NOTICE:  CREATE TABLE/PRIMARY KEY will create implicit 
                index 'pk_nome' for table 'squadra'
CREATE

ARCI=> CREATE TABLE Incontro (
data_ora TIMESTAMP,
squadra  TEXT CONSTRAINT   nome  REFERENCES Squadra(nome), 
avversaria TEXT CONSTRAINT nome  REFERENCES Squadra(nome),
campo   INT2,
torneo  TEXT CONSTRAINT titolo REFERENCES Torneo(titolo),
risultato TEXT);

ARCI-> NOTICE:  CREATE TABLE/FOREIGN KEY clause ignored; 
                not yet implemented
NOTICE:  CREATE TABLE/FOREIGN KEY clause ignored; 
                not yet implemented
NOTICE:  CREATE TABLE/FOREIGN KEY clause ignored; 
                not yet implemented
CREATE

ARCI=> CREATE FUNCTION SquadreInTorneo ( TEXT ) RETURNS TEXT AS 
 'SELECT DISTINCT squadra.nome 
         FROM squadra, incontro 
         WHERE incontro.torneo = $1 AND 
               (incontro.squadra = squadra.nome OR 
                incontro.avversaria = squadra.nome)'
   LANGUAGE 'sql';

ARCI=> SELECT SquadreInTorneo('Rione sportivo');
squadreintorneo
---------------
               
(1 row)

ARCI=> 

Questo è tutto per ora.
In futuro potremmo prendere in considerazione altri problemi, come ad esempio gestione magazzino, partita doppia, gestione areoportuale etc.







Nota sul costrutto trigger

Per gli interessati e più documentati, l'integrità dei dati su PostgreSQL fino alla versione 6.5 si otteneva facendo uso dei trigger, ovvero delle operazioni, anche complesse, che vengono automanticamente eseguite prima o dopo il verificarsi di certi eventi.

Ecco la sintassi del comando:

CREATE TRIGGER  Creates a new trigger

CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] }
    ON table FOR EACH { ROW | STATEMENT }
    EXECUTE PROCEDURE func_name ([arguments])

    eventX is one of INSERT, DELETE, UPDATE

Dalla versione 7 in poi, il ricorso alla definizione esplicita dei trigger non č pių necessaria grazie all'introduzione delle chiavi esterne (FOREIGN KEY).

DATABASE


Giuseppe Sacco è laureato in Scienze dell'Informazione presso l'Ateneo di Pisa. In passato si è occupato di Amiga (è uno dei fondatori di IPISA) e di Interfacce Utente Grafiche. Attualmente lavora nell'ambito dei prodotti ERP e si sta specializzando in amministrazione di sistema con Oracle, Informix, Unix e Windows NT. Da sempre ha tenuto sott'occhio il movimento attorno a Linux con un particolare riguardo alla distribuzione Debian della quale è coordinatore della traduzione del sito web in italiano.

Puoi contattare l'autore scrivendo a:
gsacco@diff.org


Articoli dello stesso autore:
Introduzione ad Oracle8i
Il modello entità - relazioni
Pagine web dinamiche


 


Indice dell'articolo:

Introduzione
Primo approccio alla realizzazione di una base di dati
Riletto in PostgreSQL

© 1999,2000,2001,2002 NonSoLoSoft di Ferruccio Zamuner (Italia)- tutti i diritti sono riservati