Progettare i Database


 

 

Traduzione dalla Versione inglese "Programmers Guide" a cura di Mirco Lucchini

 

Form = maschere di inserimento
Report = modulo di stampa

Con Visual Fox Pro, utilizzate i database per organizzare e mettere in relazione tabelle e viste. I database forniscono l'architettura per immagazzinare dati ed avere anche vantaggi aggiuntivi. Usando un database, si possono creare estensioni a livello di tabella, come regole per campo e regole per record, valori iniziali di campo, e triggers. Potrete anche creare procedure memorizzate e relazioni permanenti tra tabelle. Potete usare il vostro database per creare connessioni a sorgenti di dati remote e creare viste di tabelle locali e remote.

Questo capitolo fornisce le linee guida per organizzare le tabelle che saranno usate in un database di Visual Fox Pro. Esso vi guiderà attraverso la progettazione dell'esempio di database Tasmanian Traders e fornirà degli esempi aggiuntivi sulla progettazione del database.
L'esempio del database Tasmanian Traders si trova nella cartella di Visual Studio ..\samples\Vfp98\Tastrade\data.

Questo capitolo tratterà i seguenti argomenti:

Usare un metodo per la progettazione del database


Se usate un metodo predefinito per la progettazione del database, potrete creare effettivamente e velocemente un database ben progettato che vi fornirà un accesso vantaggioso alle informazioni che vi interessano. Con una solida progettazione, impiegherai meno tempo nella costruzione del database, e otterrai velocemente risultati più precisi.

Nota Il termine database e tabella non sono sinonimi in Visual Fox Pro. Il termine database (.dbc File) si riferisce a un database relazionale che è un contenitore di informazioni riguardanti una o più tabelle (.dbf files) o viste.

La chiave di un efficace progetto di database, sta nel capire esattamente quali informazioni si vogliono immagazzinare e il modo in cui un database relazionale, come Visual Fox Pro, le memorizza.
Per fornire efficientemente ed accuratamente le informazioni di cui necessitate, Visual Fox Pro ha bisogno di informazioni riguardanti soggetti differenti organizzate in tabelle separate. Per esempio, potete avere una tabella che contiene solo informazioni riguardanti gli impiegati e un'altra che contiene informazioni riguardanti le vendite.

Organizzando le vostre informazioni in maniera appropriata, renderete flessibile il vostro database in modo da poter combinare e presentare i fatti in modi diversi. Per esempio, potrete stampare report dove potrete combinare fatti riguardanti gli impiegati e fatti riguardanti le vendite.

Separare le informazioni in tabelle aggiunge flessibilità al database.

Quando progettate un database, per prima cosa dovrete spezzare le informazioni che desiderate mantenere in soggetti separati, e poi dire a Visual Fox Pro come i soggetti sono collegati agli altri cosicché Visual Fox Pro possa produrre le giuste informazioni quando ne avete bisogno. Per mantenere le informazioni in tabelle separate, dovrete organizzare e gestire i vostri dati come se costruiste un'applicazione ad alte prestazioni.

Ecco i passi necessari alla progettazione del database. Ogni passo è trattato dettagliatamente nella sezione rimanente di questo capitolo.

1. Determinare lo scopo del database La conoscenza dello scopo vi aiuterà a decidere quali informazioni volete che Visual Fox Pro immagazzini.
2. Determinare le tabelle necessarie Quando è chiaro lo scopo del vostro database, potrete dividere le informazioni in soggetti separati, come "Impiegati" o "Ordini". Ogni soggetto sarà una tabella nel vostro database.
3. Determinare i campi necessari Decidete quali informazioni volete mantenere in ogni tabella. Ogni categoria di informazione in una tabella è chiamato campo ed è visualizzato come una colonna quando scorrerete una tabella. Per esempio, un campo in una tabella Impiegati potrebbe essere Last_name (cognome); ed un altro potrebbe essere Hire_date (data_salario).
4. Determinare le relazioni Visualizzare ogni tabella e decidere come i dati di una tabella sono in relazione con i dati di un'altra tabella. Aggiungere campi alle tabelle o creare nuove tabelle per semplificare le relazioni, se necessario.
5. Rifinire il progetto Controllate il progetto per eventuali errori. Create le tabelle e aggiungete un po' di dati. Vedete se si ottengono i risultati voluti dalle tabelle. Effettuate le modifiche necessarie al progetto.

Non vi preoccupate se ci saranno errori o se dimenticate qualche cosa rispetto al progetto iniziale. Pensate ad esso come ad una bozza grezza che potrete rifinire più avanti. Eseguite delle prove con dati di esempio, prototipi dei vostri forms e reports. Con Visual Fox Pro, è facile cambiare la struttura del vostro database rispetto a come è stato creato. In ogni caso, diventerà molto più difficile effettuare cambiamenti alle tabelle dopo averle riempite di dati e dopo aver creato forms e reports. Per questa ragione assicuratevi di avere una solida struttura prima di continuare nella costruzione della vostra applicazione.

Analizzare i requisiti dei dati

Il primo passo nella progettazione di un database di Visual Fox Pro è quello di analizzare i requisiti per i vostri dati determinando lo scopo del database e come esso sarà utilizzato; vale a dire quali informazioni vorrete recuperare dal database. Da questo, potrete determinare di quali soggetti avrete bisogno per immagazzinare informazioni riguardo alle tabelle e quali informazioni avrete bisogno di memorizzare riguardo ad ogni soggetto (i campi nelle tabelle).

Parlare con le persone che utilizzeranno il database. Domandatevi a quali domande il database dovrà risposta. Impostate i reports che vorrete che esso produca. Raccogliete i forms che usate correntemente per registrare i vostri dati. Utilizzerete tutte queste informazioni nei rimanenti passi del processo di progettazione.

Esempio: Controllare le vendite e l'Inventario
Supponiamo che Tasmanian Traders, una società di import/export che vende specialità gastronomiche di tutto il mondo, voglia un database che possa tenere sotto controllo le informazioni riguardanti le vendite e l'inventario dell'azienda.

Partiamo scrivendo una lista di domande alle quali il database dovrebbe rispondere. Quante vendite del nostro prodotto abbiamo fatto il mese scorso? Chi è il fornitore del prodotto più venduto?

Proseguiamo riunendo tutti i forms ed i reports che contengono le informazioni che il database dovrebbe produrre. La società attualmente utilizza un report stampato per tenere una traccia dei prodotti che sono stati ordinati, e un form di ordini per prendere nuove ordini.

Tasmanian Traders necessita anche di stampare delle etichette per l'invio di posta a clienti, impiegati e fornitori.

Dopo aver raccolto queste informazioni siamo pronti per il prossimo passo.

Raggruppare i requisiti in tabelle

Decidere le tabelle del vostro database può essere un passo strategico nella progettazione del database.
Questo perché i risultati che si vogliono ottenere dal database - i reports che volete stampare, i forms che volete usare, e le risposte alle vostre domande - non forniscono necessariamente degli indizi riguardo alla struttura delle tabelle che produrranno tali oggetti. Essi vi dicono quello che voi volete sapere ma non come disporre le informazioni nelle tabelle.

Guardate il precedente form degli ordini come esempio. Esso include notizie riguardanti i clienti - l'indirizzo e il numero di telefono del cliente - insieme a notizie riguardanti l'ordine. Questo form vi fornisce un numero di informazioni che sapete di voler immagazzinare nel vostro database. Sebbene le notizie siano tutte sullo stesso form, potete facilmente prevenire i problemi di integrità dei dati comuni, memorizzandole in tabelle separate.

Immagazzinare informazioni una volta riduce le possibilità di errore. Per esempio, se utilizzate una sola tabella per salvare le informazioni per un form degli ordini, supponendo che un cliente vi invii tre ordini differenti, voi dovreste aggiungere l'indirizzo e il numero di telefono del cliente tre volte, una volta per ogni ordine, ma questo moltiplica le possibilità di errori in fase di inserimento dei dati.
La tabella dei Clienti memorizza l'indirizzo una sola volta.


Inoltre, se il cliente cambiasse indirizzo, dovreste accettare informazioni contraddittorie oppure cercare e cambiare tutti i records delle vendite per quel cliente nella tabella. E' molto meglio creare una tabella clienti che immagazzina l'indirizzo del cliente una sola volta nel database. In seguito se dovesse essere necessario cambiare i dati di un cliente, lo si farebbe una sola volta.

Prevenire la cancellazione di informazioni preziose. Supponiamo che un nuovo cliente faccia un ordine e poi lo annulli. Quando cancellate l'ordine dalla tabella che contiene informazioni sia riguardanti il cliente sia il suo ordine, voi cancellereste anche i dati del cliente anche se voi vorreste tenere questo nuovo cliente nel database in modo da potergli spedire il vostro prossimo catalogo. Allora, è meglio mettere le informazioni riguardanti il cliente in una tabelle Clienti separata. In questo modo potrete eliminare gli ordini senza cancellare le informazioni del cliente.
Controllate le informazioni che volete ottenere dal database e dividetele in soggetti fondamentali da avere sotto controllo, come clienti, impiegati, prodotti in vendita, fornitura di servizi e così via.
Ognuno di questi soggetti sarà una tabella separata.

Consiglio Una strategia per dividere le informazioni in tabelle è quella di guardare ai singoli avvenimenti e determinare di cosa trattano. Per esempio, nel form degli ordini di Tasmanian Traders, l'indirizzo del cliente non interessa i dati della vendita, interessa i dati del cliente. Questo suggerisce che avete bisogno di tabelle separate per i clienti. Nel report Prodotti dell'ordine, il numero di telefono del fornitore non riguarda la scorta del prodotto; riguarda il fornitore. Questo suggerisce che avete bisogno di una tabella separata per i fornitori.

Esempio: Progettare le tabelle nel database Tasmanian Traders

Il form degli ordini e il report dei Prodotti in ordine di Tasmanian Traders, includono informazioni riguardanti questi soggetti:

· Impiegati
· Clienti
· Fornitori
· Prodotti
· Ordini

Da questa lista, potete abbozzare le tabelle del database ed alcuni dei campi per ogni tabella.
Nonostante il database finale di Tasmanian Traders contenga altre tabelle, questo elenco è un buon inizio.
Più avanti in questo capitolo, vedrete come aggiungere altre tabelle per rifinire il progetto.

Determinare i campi necessari

Per determinare i campi in una tabella, decidete che cosa avete bisogno di sapere riguardo alle persone, cose, o eventi registrati nella tabella. Potete pensare ai campi come ad attributi della tabella. Ogni record (o riga) nella tabella contiene lo stesso gruppo di campi o attributi. Per esempio, un campo indirizzo in una tabella clienti contiene gli indirizzi dei clienti. Ogni record nella tabella contiene dati riguardanti un cliente, e il campo indirizzo contiene l'indirizzo per quel cliente.

Identificare i campi

Ecco alcuni consigli per determinare i vostri campi:

Correlate ogni campo direttamente al soggetto della tabella Un campo che descrive il soggetto di una tabella diversa può andare bene anche ad un'altra tabella. Più avanti, quando definirete le relazioni tra le vostre tabelle, vedrete come potrete combinare i dati da campi in tabelle multiple. Per adesso, siate sicuri che ogni campo nella tabella descriva direttamente il soggetto della tabella. Se trovate delle stesse informazioni ripetute in molte tabelle, significa che avete dei campi inutili in alcune delle tabelle.

Non includete dati calcolati o derivati
In molti casi, non si vogliono memorizzare i risultati nelle tabelle. Visual Fox Pro eseguirà per voi i calcoli quando vorrete visualizzare i risultati.

Per esempio, il form degli ordini mostrato in precedenza in questo capitolo, mostra il prezzo esteso per ogni linea dell'ordine del database di Tasmanian Traders, nonostante il campo subtotale per il prezzo esteso non sia presente in alcuna tabella di Tasmanian Traders. Invece, la tabella Order_Line_Items contiene un campo quantità che immagazzina le unità nell'ordine per ogni singolo prodotto, ed anche il prezzo unitario di ogni oggetto ordinato. Usando questi dati Visual Fox Pro calcola i subtotali ogni volta che stampate un ordine, quindi il subtotale non ha bisogno di essere memorizzato nella tabella.

Includete tutte le informazioni di cui avete bisogno E' facile trascurare le informazioni importanti. Tornate alle informazioni che avete raccolto al primo passo del progetto. Controllate i forms e i reports su carta per essere sicuri che tutte le informazioni richieste precedentemente siano incluse nelle tabelle di Visual Fox Pro o che possano essere prelevate da esse. Pensate alle richieste che farete a Visual Fox Pro. Potrà Visual Fox Pro trovare tutte le risposte utilizzando le informazioni nelle vostre tabelle? Avete identificato i campi che conterranno dati unici come l'ID del cliente? Quali tabelle contengono informazioni che unirete in un report o in un form? Per maggiori informazioni riguardanti l'identificazione di campi chiave e tabelle correlate, vedere le sezioni Usare Campi Chiave Primari e Identificare le Relazioni più avanti in questo capitolo.

Memorizzare le informazioni nelle relative più piccole parti logiche Potreste essere tentati di utilizzare un singolo campo per il nome completo, o il nome di un prodotto insieme alla sua descrizione. Combinare più di un tipo di informazione in un singolo campo renderà più difficile recuperare dei risultati più avanti. Provate a spezzare le informazioni in parti logiche; per esempio, create campi separati per il nome ed il cognome, o per il nome del prodotto, la sua categoria e la sua descrizione.

Esempio: Aggiunta di campi alla Tabelle Prodotti

Tasmanian Traders vende specialità gastronomiche importate da tutto il mondo. Gli impiegati utilizzano il report Products On Order per tenere una traccia dei prodotti ordinati.
Report per controllare l'inventario dei prodotti

Il report indica che la tabella prodotti, che contiene dati riguardanti i prodotti venduti, ha bisogno di campi aggiuntivi per il nome del prodotto, le unità immagazzinate, le quantità in ordine. Ma come fare per i campi per il nome del fornitore ed il suo numero di telefono? Per ottenere il report Visual Fox Pro ha bisogno di sapere qual è il fornitore di un determinato prodotto.

Bozza della tabella fornitori contenente i campi per il nome ed il numero di telefono del fornitore

Potete risolvere il problema senza memorizzare dati ridondanti nelle vostre tabelle creando una tabella fornitori con campi separati per il nome ed il numero di telefono. Il prossimo passo vi farà aggiungere un campo alla tabella prodotti che identificherà le informazioni del fornitore.

Utilizzare i Campi Chiave Primari

La potenza in un sistema di gestione con un database relazionale come Visual Fox Pro deriva dalla sua capacità di trovare e raccogliere insieme informazioni memorizzate in tabelle separate. Per fare in modo che Visual Fox Pro possa lavorare al meglio, ogni tabella nel vostro database dovrà includere un campo o una serie di campi che identifichino univocamente ogni singolo record immagazzinato nella tabella. Spesso questo è un unico numero di identificazione, come un numero ID per ogni impiegato o un numero di serie. Nella terminologia dei database questa informazione è chiamata chiave primaria della tabella. Visual Fox Pro usa i campi chiave primari per associare velocemente dei dati da tabelle multiple e riportare insieme i dati per voi.

Se già avete un identificativo unico per una tabella, come un gruppo di numeri del prodotto che avete generato per identificare gli oggetti nel vostro magazzino, lo potete utilizzare come chiave primaria della tabella. Ma siate sicuri che i valori in questo campo siano sempre diversi per ogni record -Visual Fox Pro non permette valori duplicati in un campo chiave primario. Per esempio, non utilizzate il nome di qualcuno come chiave primaria, perché i nomi non sono unici. Potete facilmente avere due persone con lo stesso nome nella stessa tabella.

Quando scegliete i campi chiave primari, tenete presente questi punti:

Esempio: Impostazione della chiave primaria per la tabella dei prodotti

La chiave primaria della tabella prodotti di Tasmanian Traders contiene il numero ID del prodotto. Siccome ogni numero del prodotto identifica un diverso prodotto, voi non vorrete due prodotti con lo stesso numero.

La chiave primaria per la tabella prodotti è il campo Product_id.

 

In alcuni casi potreste volere utilizzare due o più campi che insieme formino la chiave primaria di una tabella. Per esempio, la tabella Order_line_items nel database Tasmanian Traders usa due campi come sua chiave primaria: Order_id e Product_id. Più avanti vedrete perché.

Identificare le relazioni

Ora che avete suddiviso le informazioni in tabelle, avete bisogno un sistema per fare si che Visual Fox Pro le riunisca in modo comprensibile. Per esempio, il form seguente include informazioni provenienti da diverse tabelle.

Il Form Order Entry utilizza informazioni provenienti da diverse tabelle.

Visual Fox Pro è un database relazionale, questo significa che i dati correlati saranno immagazzinati in tabelle diverse; poi definirete le relazioni tra le tabelle e Visual Fox Pro utilizzerà le relazioni per trovare le informazioni associate contenute nel vostro database.

Per esempio, supponiate di voler telefonare ad un impiegato per avere informazioni riguardanti le sue vendite. Il numero di telefono dell'impiegato è registrato nella tabella impiegati e le vendite sono registrate nella tabella Ordini. Quando chiedete a Visual Fox Pro la vendita che vi interessa, Visual Fox Pro può consultare il numero di telefono basato sulla relazione tra le tabelle. Esso funziona perché Employee_id, la chiave primaria della tabella impiegati, è anche un campo nella tabella ordini. Nella terminologia dei database, il campo Employee_id nella tabella ordini è chiamato chiave esterna (foreign key), perché si riferisce ad una chiave primaria di una tabella diversa o esterna.

Il campo Employee_id come chiave primaria per la tabella Impiegati e come chiave esterna per la tabella Ordini

Così per impostare una relazione tra due tabelle - Tabella A e Tabella B - verrà aggiunta una chiave primaria all'altra tabella cosicché essa appaia in entrambe le tabelle. Ma quale sarà la chiave primaria della tabella da utilizzare?. Per impostare la relazione correttamente, dovrete determinare la natura della relazione. Esistono tre tipi di relazioni tra tabelle.

· Relazione uno-a-molti
· Relazione molti-a-molti
· Relazione uno-a-uno

La parte rimanente di questa sezione mostra un esempio di ogni tipo di relazione e spiega come progettare le vostre tabelle in modo che Visual Fox Pro possa associare i dati correttamente. Lo scopo di ogni esempio è quello di spiegare come possiate determinare le relazioni tra le tabelle e come decidere quali campi appartenenti alle tabelle possano essere idonei per queste relazioni - esso non descrive come usare l'interfaccia di Visual Fox Pro per relazionare le tabelle.

Esempio: creare una relazione Uno-a-molti

Una relazione uno-a-molti, è il tipo di relazione più comune in un database relazionale. . In una relazione uno-a-molti, un record nella Tabella A può avere più di un record correlato nella Tabella B, ma un record nella Tabella B può avere al massimo un solo record correlato nella Tabella A.

Per esempio, le tabelle Categorie e Prodotti nel database Tasmanian Traders hanno una relazione di tipo uno-a-molti.

Le tabelle Categorie e Prodotti rappresentano una relazione uno-a-molti.



Per impostare la relazione, aggiungete il campo o i campi, che rappresenteranno la chiave primaria, dalla parte "uno" della relazione alla tabella dalla parte "molti" della relazione. Utilizzerete una chiave primaria o a indice candidato per la parte "uno" della relazione e una chiave ad indice regolare per la parte "molti". In questo caso dovrete aggiungere il campo Category_id dalla tabella Categorie alla tabella Prodotti, perché una categoria contiene molti prodotti. Visual Fox Pro utilizza il numero identificativo della categoria per trovare la corretta categoria per ogni prodotto.



Esempio: Creare una relazione Molti-a-Molti

Nella relazione molti-a-molti, un record nella Tabella A può avere più di un record corrispondente nella Tabella B. e un record nella Tabella B può avere più di un record corrispondente nella Tabella A. Questo tipo di relazione richiede delle modifiche al vostro database prima che possiate specificare correttamente la relazione a Visual Fox Pro.
Per riconoscere le relazioni molti-a-molti tra le vostre tabelle, è importante dare uno sguardo ad entrambe le direzioni della relazione. Per esempio, considerate la relazione tra ordini e prodotti dell'azienda Tasmanian Traders. Un ordine può contenere più di un prodotto. Così per ogni record nella tabella degli ordini, potrebbero esserci più record nella tabella prodotti; ma non è tutto, ogni prodotto potrebbe apparire in molti ordini; così per ogni record della tabella prodotti, potrebbero esserci molti record nella tabella ordini.

Le tabelle Ordini e Prodotti rappresentano una relazione molti-a-molti.

Esempio: Creare una relazione Uno-a-Uno


In una relazione uno-a-uno, un record della Tabella A non può avere più di un record corrispondente nella Tabella B, ed un record della Tabella B non può avere più di un record corrispondente nella Tabella A. Questo tipo di relazione è insolito e potrebbe essere richiamata per alcuni cambiamenti nella progettazione del vostro database.

La relazione uno-a-uno tra tabelle è insolita perché in molti casi, l'informazione nelle due tabelle potrebbe semplicemente essere combinata in una tabella. Per esempio, supponete di creare una tabella chiamata Giocatori di Ping-Pong per controllare le informazioni riguardanti il torneo di Ping-Pong di Tasmanian Traders. Siccome i giocatori di ping-pong sono tutti impiegati di Tasmanian Traders, questa tabella ha una relazione uno-a-uno con la tabella Impiegati del database Tasmanian Traders.
Le tabelle Impiegati e Giocatori di Ping-Pong rappresentano una relazione uno-a-uno.


Potreste aggiungere tutti i campi della tabelle Giocatori di Ping-Pong alla tabella Impiegati. Ma la tabella Giocatori di Ping-Pong controlla un evento momentaneo e non si desiderano altre informazioni una volta che l'evento si è verificato. In aggiunta, non tutti gli impiegati giocano a ping-pong, così se questi campi fossero inclusi nella tabella Impiegati, potrebbero non contenere niente per diversi record. Per questi motivi ha senso creare una tabella separata.

Quando identificate la necessità di una relazione uno-a-uno nel vostro database, considerate di poter mettere insieme le informazioni in una sola tabella. Per esempio, nella tabella impiegati, un impiegato può avere un direttore che è anche un impiegato. Potete aggiungere un campo numero identificativo del direttore. Per ottenere le informazioni più avanti potrete creare un auto collegamento nelle vostre query o nelle viste. Non avete bisogno di tabelle separate per risolvere una relazione uno-a-uno. Se per qualche motivo non volete farlo, ecco come impostare una relazione uno-a-uno tra due tabelle:
· se le due tabelle anno il medesimo soggetto, potrete probabilmente impostare la relazione usando lo stesso campo chiave primaria in entrambe le tabelle.
· Se le due tabelle hanno soggetti diversi con chiavi primarie diverse, prendete una delle tabelle( o l'altra) e mettete il suo campo chiave primaria nell'altra tabella come chiave esterna.


(segue)

Traduzione dalla Versione inglese "Programmers Guide" a cura di Mirco Lucchini

© FoxPro e Visual FoxPro sono un marchi registrati da Microsoft Corporation

 

 

Febbraio 2002
 

FoxPro e Visual FoxPro® sono un marchi registrati da Microsoft Corporation

Fonte: "Programmers Guide Visual FoxPro®" di Microsoft© in lingua inglese.
Questa guida ha il solo scopo di fornire le indicazioni
per muovere i primi passi con questo bellissimo strumento.

 


dal 22 Giugno 1999
webmaster@foxitaly.com