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
 
  
    
    
    
 |   
 |