NEXT: Indice della documentazione
PREV: progettazione logica Home page del Corso

Progettazione fisica

Scelta degli strumenti software
Sul personal computer in cui dovranno essere memorizzati i dati sono installati il sistema operativo Windows NT e il DBMS Microsoft Access 97: è però intenzione del team non usare Access per rendere l'applicazione più portabile; questa caratteristica è interessante non solo per ragioni didattiche, ma anche perché l'applicazione dovrà rimanere in servizio per un periodo di tempo molto lungo e non è quindi pensabile di vincolarla a strumenti hardware e software molto specifici.
Dopo una lunga valutazione, il gruppo ha deciso di adottare MySQL come motore di database. MySQL è un DBMS disponibile su molte piattaforme, tra cui Win32, Linux e SunOS: in questo modo, per il gruppo è possibile sviluppare e collaudare l'applicazione in un ambiente multiutente come Unix (sui propri PC Linux o sulle workstation del DEI), passando a Windows (ambiente monoutente) solo nella fase finale di test e installazione presso la biblioteca di Santa Giustina. Un altro vantaggio di MySQL è che il suo utilizzo è gratuito per tutte le piattaforme non-Windows; la TcX AB, ditta produttrice di MySQL, rilascia inoltre licenze gratuite anche per Windows dietro motivata richiesta. Il nostro gruppo ha scritto alla TcX e, vista la natura assolutamente non-profit del progetto M.O.N.K., non ha avuto alcuna difficoltà ad ottenere una licenza "ad hoc" per la biblioteca di Santa Giustina.
Per la realizzazione delle applicazioni, sono stati inizialmente valutati l'utilizzo del linguaggio JAVA e l'implementazione tramite script CGI per l'interfaccia utente e codice C++ per l'interfaccia con il DBMS: alla fine si è scelta la seconda strada, visto che nessun membro del gruppo ha esperienza di programmazione in JAVA. Anche in questo caso, gli strumenti software sono stati scelti in modo da garantire la massima portabilità:
  • come compilatore C++, si è scelto il Cygwin della Cygnus Solutions; si tratta della versione per Windows del noto compilatore GNU, disponibile per moltissime piattaforme.
  • Come web server, si è optato per il diffusissimo Apache;
  • come web browser di riferimento si è scelto Netscape Navigator della Netscape Communications Corporation. In linea di principio, l'interfaccia utente non dovrebbe avere problemi di sorta anche usando Internet Explorer: il gruppo ha però deciso di eseguire i suoi test con Navigator perché tale browser, al contrario del concorrente della Microsoft, supporta da anni una moltitudine di piattaforme.
    Tutti questi strumenti prevedono un utilizzo gratuito per scopi non commerciali, quindi consentono al gruppo di completare la progettazione fisica senza affrontare alcuna spesa. Coerentemente con lo spirito di queste licenze, tutto il codice del progetto M.O.N.K. è disponibile su queste pagine alle condizioni della GNU General Public License, nella speranza che esso possa servire come aiuto ed esempio nello sviluppo di qualche altro progetto.

    Implementazione dello schema logico
    Il seguente codice SQL implementa lo schema relazionale visto durante la progettazione logica; tale codice dovrebbe essere compatibile con un qualunque DBMS che supporti lo standard "Entry SQL", ma è stato collaudato solo con MySQL.
    CREATE TABLE SCARICO_INFO_OPZ (
        Anno SMALLINT UNSIGNED NOT NULL,
        Numero SMALLINT UNSIGNED NOT NULL,
        Annotazioni VARCHAR(40) NOT NULL,
        PRIMARY KEY (Anno,Numero),
        FOREIGN KEY (Anno,Numero) REFERENCES SCARICO ON DELETE CASCADE
    );
    
    CREATE TABLE SCARICO (
        Anno SMALLINT UNSIGNED NOT NULL,
        Numero SMALLINT UNSIGNED NOT NULL,
        Ladata DATE,
        Oggetto TINYTEXT NOT NULL,
        Tipo_documento VARCHAR(20),
        Classifica CHAR(3),
        Destinatario SMALLINT UNSIGNED,
        PRIMARY KEY (Anno,Numero),
        FOREIGN KEY (Destinatario) REFERENCES CORRISPONDENTE_AFFIDATARIO(Codice) ON DELETE NO ACTION
    );
    
    CREATE TABLE CORRISPONDENZA (
        Anno_scarico SMALLINT UNSIGNED NOT NULL,
        Numero_scarico SMALLINT UNSIGNED NOT NULL,
        Anno_carico SMALLINT UNSIGNED NOT NULL, 
        Numero_carico SMALLINT UNSIGNED NOT NULL,
        PRIMARY KEY (Anno_scarico,Numero_scarico),
        FOREIGN KEY (Anno_scarico,Numero_scarico) REFERENCES SCARICO (Anno,Numero) ON DELETE NO ACTION,
        FOREIGN KEY (Anno_carico,Numero_carico) REFERENCES CARICO (anno,numero) ON DELETE NO ACTION
    ); 
    
    CREATE TABLE RIPARTO (
        Codice CHAR(3) NOT NULL,
        Significato VARCHAR(128) NOT NULL,
        PRIMARY KEY (Codice)
    );
    
    CREATE TABLE CARICO (
        Anno SMALLINT UNSIGNED NOT NULL,
        Numero SMALLINT UNSIGNED NOT NULL,
        Ladata DATE,
        Oggetto TINYTEXT NOT NULL,
        Tipo_documento VARCHAR (20), 
        Riparto CHAR (3),
        Mittente SMALLINT UNSIGNED,
        Data_atto VARCHAR (20),
        Num_atto VARCHAR (40),
        Data_fax DATE,
        PRIMARY KEY (Anno,Numero),
        FOREIGN KEY (Riparto) REFERENCES RIPARTO (Codice) ON DELETE NO ACTION,
        FOREIGN KEY (Mittente) REFERENCES CORRISPONDENTE_AFFIDATARIO (Codice) ON DELETE NO ACTION
    );
    
    CREATE TABLE AFFIDAMENTO (
        Anno_carico SMALLINT UNSIGNED NOT NULL, 
        Numero_carico SMALLINT UNSIGNED NOT NULL, 
        Codice_affidatario SMALLINT UNSIGNED NOT NULL,
        Data_inizio_aff DATE NOT NULL,
        Data_fine_aff DATE,
        PRIMARY KEY (Anno_carico,Numero_carico,Codice_affidatario),
        FOREIGN KEY (Anno_carico,Numero_carico) REFERENCES CARICO (Anno,Numero) ON DELETE NO ACTION,
        FOREIGN KEY (Codice_affidatario) REFERENCES CORRISPONDENTE_AFFIDATARIO (Codice) ON DELETE NO ACTION
    );
    
    CREATE TABLE CORRISPONDENTE_AFFIDATARIO (
        Codice SMALLINT UNSIGNED NOT NULL, 
        Denominaz1 VARCHAR (40) NOT NULL,
        Denominaz2 VARCHAR (40),
        Tipo VARCHAR (20) NOT NULL, 
        Via VARCHAR (50),
        Citta VARCHAR (30),
        Cap CHAR (6),
        Telefono VARCHAR (25),
        Fax VARCHAR (25),
        Obsoleto SET('VALIDO','SCADUTO') NOT NULL,
        PRIMARY KEY (Codice)
    );
    
    CREATE TABLE CORRISP_ORGANIZZAZIONE (
        Codice SMALLINT UNSIGNED NOT NULL,
        Partita_iva VARCHAR (20),
        Tramite VARCHAR (50),
        PRIMARY KEY (Codice),
        FOREIGN KEY (Codice) REFERENCES CORRISPONDENTE_AFFIDATARIO ON DELETE CASCADE
    );
                     
    CREATE TABLE CORRISP_PERSONA (
        Codice SMALLINT UNSIGNED NOT NULL,
        Titolo VARCHAR (30),
        Cod_fisc CHAR (16),
        PRIMARY KEY (Codice),
        FOREIGN KEY (Codice) REFERENCES CORRISPONDENTE_AFFIDATARIO ON DELETE CASCADE
    );
    
    CREATE TABLE DIPENDENTE_INFO_AGG (
        Codice_dip SMALLINT UNSIGNED NOT NULL,
        Ufficio VARCHAR (50), 
        Autorizzazione VARCHAR (10),
        PRIMARY KEY (Codice_dip),
        FOREIGN KEY (Codice_dip) REFERENCES CORRISPONDENTE_AFFIDATARIO (Codice) ON DELETE CASCADE 
    ); 
    
    CREATE TABLE OPERAZIONE (
        Codice_operatore SMALLINT UNSIGNED NOT NULL, 
        Data_operazione DATE NOT NULL,
        Ora_operazione TIME, 
        Tipo_operazione VARCHAR (50) NOT NULL,
        PRIMARY KEY (Codice_operatore,Data_operazione),
        FOREIGN KEY (Codice_operatore) REFERENCES DIPENDENTE_INFO_AGG (Codice_dip) ON DELETE CASCADE
    );
    
    Realizzazione dell'applicazione principale
    L'applicazione principale permette all'utente di interagire con la base di dati (compiendo inserimenti, cancellazioni, interrogazioni...) attraverso un'interfaccia grafica basata su un browser web; il browser comunica tramite il protocollo CGI con un programma scritto in C++ che ha il compito di interpretare le richieste dell'utente e di rispondere con pagine HTML generate dinamicamente. La natura web dell'interfaccia ha il grosso vantaggio di consentire l'accesso alla base di dati a più persone contemporaneamente e da computer diversi; d'altra parte, i protocolli HTTP e CGI sono "senza stato", e questo è uno svantaggio perché rende difficile tenere traccia del comportamento degli utenti garantendo al contempo la sicurezza. Per stabilire una sessione di lavoro isolata con ogni utente, e mantenere lo stato di tale sessione fino alla sua chiusura, è stata adottata una architettura di tipo client-server: il programma CGI comunica tramite socket con un ulteriore processo ("angelo custode") di cui esiste una copia per ogni utente attivo; tale processo mantiene lo stato, comunica con il DBMS, genera le pagine web e, in breve, accompagna l'utente dal login al logout.
    Ulteriori dettagli sull'applicazione saranno disponibili in seguito.

    Realizzazione delle applicazioni accessorie
    Le applicazioni accessorie permettono di
  • creare una base di dati vuota;
  • effettuare le operazioni di backup e ripristino di una base di dati esistente;
  • gestire le autorizzazioni degli utenti che hanno accesso alla base di dati.
    Dato che il loro utilizzo è saltuario, queste applicazioni presentano un'interfaccia a caratteri, sicuramente meno "amichevole" di quella dell'applicazione principale. Anche in questo caso, ulteriori dettagli saranno disponibili tra qualche tempo.


    NEXT: Indice della documentazione
    PREV: progettazione logica Home page del Corso