Nozioni fondamentali sulla progettazione di database

Un database progettato correttamente consente l'accesso a informazioni aggiornate e accurate. Poiché una progettazione corretta è essenziale per raggiungere gli obiettivi per cui si utilizza un database, può essere utile investire il tempo necessario per apprendere i principi di una buona progettazione. In definitiva, sarà molto più probabile ottenere un database che soddisfi esigenze specifiche e che supporti facilmente le modifiche.

In questo articolo vengono descritte le linee guida per la pianificazione di un database desktop. Verrà inoltre illustrato come identificare le informazioni necessarie e come suddividerle in tabelle e colonne appropriate, nonché come si imposta una correlazione fra tali tali. Prima di procedere alla creazione del primo database desktop, è consigliabile leggere il presente articolo.

 Importante   In Microsoft Access 2010 è possibile utilizzare modalità di progettazione innovative che consentono di creare applicazioni di database per il Web. Quando si progetta per il Web è necessario prendere in considerazione diversi aspetti. In questo articolo non viene descritta la progettazione di applicazioni di database Web. Per ulteriori informazioni, vedere l'articolo Creare un database da condividere sul Web.

Contenuto dell'articolo


Terminologia di database che è utile conoscere

In Access 2010 le informazioni vengono organizzate in tabelle, ovvero elenchi di righe e colonne paragonabili a un registro contabile o a un foglio di calcolo. In un semplice database può essere presente una sola tabella, ma per la maggior parte dei database ne sono necessarie più d'una. In una tabella è possibile, ad esempio, archiviare informazioni sui prodotti, in un'altra tabella le informazioni sugli ordini e in un'altra ancora le informazioni sui clienti.

Immagine che raffigura tre tabelle in fogli dati

Ogni riga viene più correttamente definita record e ogni colonna è detta campo. Un record costituisce un modo significativo e coerente di combinare informazioni su vari elementi. Un campo è un singolo elemento di informazioni, ovvero un tipo di elemento che viene visualizzato in ogni record. Nella tabella Prodotti, ad esempio, ogni riga o record conterrà informazioni su un prodotto, mentre in ogni colonna o campo sarà incluso un qualche tipo di informazioni su tale prodotto, ad esempio il nome o il prezzo.

Torna all'inizio Torna all'inizio

Descrizione di una progettazione di database corretta

Il processo di progettazione di un database si basa su determinati principi, il primo dei quali è che la presenza di informazioni duplicate, dette anche dati ridondanti, costituisce un aspetto negativo, in quanto si spreca spazio e si aumenta la probabilità di introdurre errori e incoerenze. Il secondo principio è che la correttezza e la completezza delle informazioni sono elementi importanti. Se il database contiene informazioni non corrette, anche tutti i report che recuperano informazioni da tale database conterranno informazioni non corrette. Di conseguenza, qualsiasi decisione assunta in base a tali report sarà fondata su informazioni errate.

Una progettazione di database corretta consentirà pertanto di:

  • Divider le informazioni in tabelle basate su un argomento per ridurre i dati ridondanti.
  • Immettere in Access le informazioni necessarie per unire in join le informazioni nelle tabelle secondo le esigenze.
  • Supportare e assicurare l'accuratezza e l'integrità delle informazioni.
  • Soddisfare le esigenze di elaborazione dei dati e di creazione di report.

Torna all'inizio Torna all'inizio

Processo di progettazione

Il processo di progettazione è costituito dai passaggi seguenti:

  • Determinare lo scopo del database    

È utile per prepararsi ai passaggi rimanenti.

  • Individuare e organizzare le informazioni necessarie     

Raccogliere tutti i tipi di informazioni che potrebbe essere necessario registrare nel database, ad esempio nome del prodotto e numero d'ordine.

  • Dividere le informazioni in tabelle    

Dividere gli elementi di informazioni in entità o argomenti principali, ad esempio Prodotti o Ordini. Ogni argomento diventa quindi una tabella.

  • Trasformare elementi di informazioni in colonne    

Stabilire quali informazioni si desidera archiviare in ogni tabella. Ogni elemento diventa un campo e viene visualizzato sotto forma di colonna nella tabella. Una tabella Dipendenti potrebbe, ad esempio, includere campi quali Cognome e Data di assunzione.

  • Specificare le chiavi primarie    

Scegliere la chiave primaria di ogni tabella. La chiave primaria è una colonna utilizzata per identificare in modo univoco ogni riga, ad esempio ID prodotto o ID ordine.

  • Impostare le relazioni tra tabelle    

Esaminare ogni tabella e decidere in che modo i dati presenti in una tabella sono correlati ai dati in altre tabelle. Aggiungere campi alle tabelle o creare nuove tabelle per chiarire le relazioni, se necessario.

  • Ottimizzare la progettazione    

Analizzare la progettazione per verificare se sono presenti errori. Creare le tabelle e aggiungere alcuni record di dati di esempio. Controllare se è possibile ottenere i risultati desiderati da tali tabelle. Apportare modifiche alla progettazione, se necessario.

  • Applicare le regole di normalizzazione    

Applicare le regole di normalizzazione dei dati per verificare se le tabelle sono strutturate correttamente. Apportare modifiche alle tabelle, se necessario.

Torna all'inizio Torna all'inizio

Identificazione dello scopo del database

È consigliabile annotare su carta lo scopo del database, ovvero qual è lo scopo, come si prevede di utilizzarlo e chi lo utilizzerà. Per un piccolo database per un'attività di piccole dimensioni, ad esempio, è possibile scrivere qualcosa di molto semplice come "Il database dei clienti contiene un elenco di informazioni sui clienti allo scopo di produrre lettere e report". Se il database è più complesso o viene utilizzato da molte persone, come accade stesso in una configurazione aziendale, lo scopo può facilmente richiedere uno o più paragrafi e dovrebbe includere l'indicazione su quando o come ogni persona utilizzerà il database. L'idea è di avere un'esposizione degli obiettivi ben sviluppata a cui sia possibile fare riferimento durante tutto il processo di progettazione. La disponibilità di tale esposizione consente di concentrarsi sugli obiettivi quando si assumono decisioni.

Torna all'inizio Torna all'inizio

Individuazione e organizzazione delle informazioni necessarie

Per individuare e organizzare le informazioni necessarie, iniziare da quelle esistenti. È possibile, ad esempio, che gli ordini di acquisto vengano registrati in un libro mastro o che le informazioni relative ai clienti siano annotate su moduli cartacei conservati in uno schedario. Raccogliere tali documenti ed elencare ogni tipo di informazioni rilevate, ad esempio tutte le caselle che vengono compilate in un modulo. Se non sono disponibili moduli esistenti, si supponga invece di dover progettare un modulo per la registrazione delle informazioni relative ai clienti, cercando di immaginare quali informazioni verrebbero inserite nel modulo, quali caselle compilabili sarebbe opportuno creare, identificando ognuno di questi elementi e creandone un elenco. Si supponga inoltre, ad esempio, che attualmente per l'elenco dei clienti vengano utilizzate schede. L'esame di tali schede potrebbe rivelare che su ogni scheda sono indicati il nome del cliente, l'indirizzo, la città, lo stato il codice postale e il numero di telefono. Ognuno di questi elementi rappresenta una potenziale colonna di una tabella.

Non è necessario che questo elenco risulti perfetto durante la preparazione iniziale. È invece consigliabile includere nell'elenco tutti gli elementi possibili e chiedere suggerimenti a eventuali altre persone che utilizzeranno il database. L'elenco potrà essere ottimizzato in un momento successivo.

È quindi opportuno considerare i tipi di report o lettere che si desidera generare dal database. Ad esempio, potrebbe essere utile creare un report sulle vendite di prodotti in cui sono visualizzate le vendite per zona oppure un report di inventario riepilogativo con i livelli di scorte dei prodotti. Potrebbe inoltre essere utile generare lettere tipo da inviare ai clienti per annunciare una vendita speciale o per offrire un bonus. Progettare il report mentalmente, immaginando quale aspetto avrà. Stabilire quali informazioni si desidera inserire nel report e aggiungerle all'elenco. Procedere allo stesso modo per la lettera tipo e per qualsiasi altro report che si prevede di creare.

Persona che immagina un report di inventario dei prodotti

Pensare ai report e alle lettere che potrebbe essere utile creare consente di identificare più facilmente gli elementi richiesti nel database. Si supponga, ad esempio, di voler offrire ai clienti l'opportunità di accettare o rifiutare esplicitamente aggiornamenti periodici tramite posta elettronica e di voler stampare un elenco dei clienti che hanno accettato. Per registrare tali informazioni, aggiungere una colonna “Invio messaggio di posta elettronica” alla tabella dei clienti e impostare il campo su Sì o No per ogni cliente.

Il requisito di inviare messaggi di posta elettronica ai clienti suggerisce un altro elemento da registrare. Dopo avere ricevuto la conferma che un cliente desidera ricevere messaggi di posta elettronica, si dovrà conoscere l'indirizzo di posta elettronica a cui inviarli. È quindi necessario registrare un indirizzo di posta elettronica per ogni cliente.

È consigliabile creare un prototipo di ogni report o elenco di output e considerare quali elementi saranno necessari per generare il report. Ad esempio, esaminando una lettera tipo si potrebbe pensare ad alcuni particolari. Se si desidera includere una vera e propria formula di apertura, ad esempio una stringa "Sig.", "Sig.ra" o "Sig.na" iniziale, si dovrà creare un elemento per la formula di apertura. È inoltre possibile che si desideri iniziare solitamente una lettera con la formula “Egr. Sig. Macagno”, anziché “Egr. Sig. Maurizio Macagno”. Ciò suggerisce che è in genere consigliabile archiviare il cognome separatamente dal nome.

Un punto chiave da ricordare è la necessità di suddividere ogni informazione nelle relative parti utili più piccole. Nel caso di un nome, per render immediatamente disponibile il cognome, è opportuno dividere il nome in due parti, Nome e Cognome. Per ordinare un report in case al cognome, ad esempio, è utile archiviare separatamente il cognome del cliente. È in genere consigliabile inserire in un campo separato le informazioni in base alle quali si desidera applicare criteri di ordinamento, ricerca e calcolo oppure creare un report.

Pensare alle domande alle quali il database dovrebbe rispondere. Ad esempio, la quantità di vendite chiuse per il prodotto in primo piano durante il mese precedente, dove risiedono i clienti migliori, chi è il fornitore del prodotto più venduto. La capacità di prevedere queste domande consente di focalizzare l'attenzione su ulteriori elementi da registrare.

Dopo avere raccolto queste informazioni, è possibile procedere al passaggio successivo.

Torna all'inizio Torna all'inizio

Suddivisione delle informazioni in tabelle

Per dividere le informazioni in tabelle, scegliere le entità o gli argomenti principali. Dopo avere individuato e organizzato le informazioni, ad esempio, per un database relativo alle vendite di prodotti, l'elenco preliminare potrebbe avere l'aspetto seguente:

Elementi di informazioni scritti a mano raggruppati in argomenti

Le principali entità qui illustrate sono i prodotti, i fornitori, i clienti e gli ordini. È quindi consigliabile iniziare con queste quattro tabelle: una per le informazioni sui prodotti, una per le informazioni sui fornitori, una per le informazioni sui clienti e una per le informazioni sugli ordini. Anche se l'elenco non è completo, è un buon punto di partenza. È possibile continuare a ottimizzare questo elenco finché non si ottiene una progettazione appropriata.

Quando inizialmente si esamina l'elenco di elementi preliminare, si potrebbe essere tentati di inserirli tutti in un'unica tabella, anziché le quattro illustrate nella figura precedente. Di seguito viene spiegato perché non è opportuno procedere in questo modo. Si consideri per un momento la tabella illustrata di seguito:

Immagine che illustra una tabella contenente prodotti e fornitori

In questo caso ogni riga contiene informazioni sia sul prodotto che sul relativo fornitore. Poiché è possibile che vengano acquistati molti prodotti dallo stesso fornitore, il nome del fornitore e le informazioni sull'indirizzo devono essere ripetute molte volte, con uno spreco di spazio su disco. La registrazione delle informazioni sul fornitore una sola volta in una tabella Fornitori distinta, è una soluzione decisamente migliore.

Un secondo problema con questa progettazione si presenta quando è necessario modificare le informazioni sul fornitore. Si supponga ad esempio di dover modificare l'indirizzo del fornitore. Poiché viene visualizzato in diverse posizioni, è possibile che l'indirizzo venga modificato in una posizione che che si dimentichi accidentalmente di modificarlo in un'altra. Registrando l'indirizzo del fornitore in una sola posizione si risolve invece il problema.

Quando si progetta un database, è sempre opportuno cercare di registrare ogni dato una sola volta. Se si rileva che la stessa informazione viene ripetuta in più posizioni, ad esempio l'indirizzo di un particolare fornitore, inserire tale informazione in una tabella distinta.

Si supponga infine che Coho Winery fornisca un solo prodotto e che si desideri eliminare tale prodotto mantenendo il nome del fornitore e le informazioni sull'indirizzo. Non è possibile eliminare il record del prodotto senza perdere le informazioni sul fornitore. Poiché infatti ogni record contiene dati su un prodotto, nonché dati relativi a un fornitore, non è possibile eliminarne uno senza eliminare l'altro. Per mantenere separati questi dati, è necessario dividere una tabella in due: una per le informazioni sul prodotto e un'altra per le informazioni sul fornitore. In questo modo l'eliminazione di un record relativo al prodotto cancellerà solo i dati relativi a tale prodotto, non quelli relativi al fornitore.

Dopo avere scelto l'argomento rappresentato da una tabella, nelle relative colonne dovranno essere archiviati solo dati su tale argomento. Nella tabella dei prodotti, ad esempio, devono essere archiviati solo dati sui prodotti. Poiché l'indirizzo del fornitore è un dato relativo al fornitore e non al prodotto, appartiene alla tabella dei fornitori.

Torna all'inizio Torna all'inizio

Trasformazione di elementi di informazioni in colonne

Per determinare le colonne di una tabella, è opportuno stabilire quali sono le informazioni relative all'argomento registrato nella tabella di cui è necessario tenere traccia. Per la tabella Clienti, ad esempio, Nome, Indirizzo, Città-Stato-CAP, Invio messaggio di posta elettronica, Formula di apertura e Posta elettronica sono un buon elenco di colonne da cui iniziare. Ogni record nella tabella contiene lo stesso set di colonne, quindi è possibile archiviare informazioni relative a Nome, Indirizzo, Città-Stato-CAP, Invio messaggio di posta elettronica, Formula di apertura e Posta elettronica per ogni record. La colonna Indirizzo, ad esempio, contiene l'indirizzo per quel cliente.

Dopo avere determinato il set iniziale di colonne per ogni tabella, è possibile definire le colonne con ancora maggiore precisione. È consigliabile, ad esempio, archiviare il nome del cliente in due colonne distinte, nome e cognome, in modo da poter eseguire operazioni di ordinamento, ricerca e indicizzazione solo su tali colonne. In modo analogo, l'indirizzo è in effetti composto da cinque componenti distinti, ovvero indirizzo, città, provincia, CAP e paese, e anche in questo caso è consigliabile archiviarli in colonne distinte. Se si desidera eseguire un'operazione di ricerca o di ordinamento oppure applicare un filtro in base, ad esempio, alla provincia, è necessario archiviare le informazioni corrispondenti in una colonna distinta.

È opportuno considerare inoltre se il database conterrà informazioni solo di origine nazionale o anche internazionale. Se si prevede, ad esempio, di archiviare indirizzi internazionali, è preferibile creare una colonna Paese anziché provincia, in modo da potervi inserire sia la provincie nazionali sia le aree di altri paese. Una colonna CAP sarà invece appropriata anche per archiviare indirizzi internazionali.

Nell'elenco seguente sono ripostati alcuni suggerimenti utili per determinare quali colonne creare.

  • Non includere dati calcolati    

Nella maggior parte dei casi, è consigliabile non archiviare risultati di calcoli nelle tabelle. Al contrario, è possibile fare in modo che i calcoli vengano eseguiti da Access quando si desidera visualizzare il risultato. Si supponga, ad esempio, di avere un report Prodotti ordinati in cui viene visualizzato il subtotale delle unità ordinate per ogni categoria di prodotto nel database.Non è tuttavia presente una colonna di subtotale Unità ordinate in alcuna tabella. La tabella Prodotti include invece una colonna Unità ordinate in cui sono archiviate le unità ordinate per ogni prodotto. Utilizzando questi dati, Access è in grado di calcolare il subtotale ogni volta che si stampa il report. È consigliabile non archiviare il subtotale stesso in una tabella.

  • Archiviare le informazioni nelle relative parti logiche più piccole    

Si potrebbe essere tentati di creare un singolo campo per nomi e cognomi o per nomi di prodotti e relative descrizioni. Se si combina più di un tipo di informazioni in un campo, sarà difficile recuperare i dati in seguito. Cercare di scomporre le informazioni in parti logiche. Ad esempio, creare campi distinti per nome e per cognome o per nome di prodotto, categoria e descrizione.

Elenco di elementi di informazioni durante il processo di progettazione

Dopo avere ottimizzato le colonne dati in ogni tabella, è possibile scegliere la relativa chiave primaria.

Torna all'inizio Torna all'inizio

Specifica di chiavi primarie

È consigliabile includere in ogni tabella una colonna o un set di colonne che identifichi in modo univoco ogni riga archiviata nella tabella. Si tratta spesso di un numero di identificazione univoco, ad esempio il numero ID di un dipendente o un numero di serie. Nella terminologia di database queste informazioni sono definite chiave primaria della tabella. In Access i campi chiame primaria vengono utilizzati per associare rapidamente dati da più tabelle e riunire automaticamente i dati.

Se si dispone già di un identificatore univoco per una tabella, ad esempio un numero di prodotto che identifica in modo univoco ogni prodotto nel catalogo, è possibile utilizzarlo come chiave primaria della tabella, ma solo se i valori in questa colonna saranno sempre diversi per ogni record. Non è possibile utilizzare valori duplicati in una chiave primaria. Non utilizzare, ad esempio, nomi di persone come chiave primaria, poiché i nomi non sono univoci. È molto facile che due persone abbiano lo stesso nome nella stessa tabella.

Una chiave primaria deve avere sempre un valore. Se il valore di una colonna può diventare a un certo punto non assegnato o sconosciuto (valore mancante), non può essere utilizzato come componente di una chiave primaria.

È consigliabile scegliere sempre una chiave primaria il cui valore non venga modificato. In un database che utilizza più di una tavella, è possibile utilizzare la chiave primaria di una tabella come riferimento in altre tabelle. Se la chiave primaria viene modificata, tale modifica dovrà essere applicata anche a qualsiasi altro elemento in cui viene fatto riferimento a tale chiave. L'utilizzo di una chiave primaria non soggetta a modifiche riduce la possibilità che non sia più sincronizzata con altre tabelle che vi fanno riferimento.

Spesso come chiave primaria viene utilizzato un numero univoco arbitrario. È possibile, ad esempio, assegnare a ogni ordine un numero d'ordine univoco. Poiché il solo scopo di un numero d'ordine è quello di identificare un ordine, dopo essere stato assegnato non viene mai modificato.

Se non si dispone di una colonna o di un set di colonne adatte a costituire la chiave primaria, è possibile utilizzare una colonna con tipo di dati Numerazione automatica. Quando si utilizza questo tipo di dati, viene assegnato automaticamente un valore. Tale identificatore non rappresenta un dato effettivo, ovvero non contiene alcuna informazione effettiva che descriva la riga a cui è associato. L'utilizzo di questo tipo di identificatori come chiave primaria è ideale in quanto non vengono modificati. Una chiave primaria che contiene dati relativi a una riga, ad esempio un numero di telefono o il nome di un cliente, è più facilmente soggetta a modifiche, poiché i dati stessi che contiene potrebbero variare nel tempo.


Immagine che illustra la tabella Prodotti con il campo chiave primaria.

Callout 1 Una colonna impostata sul tipo di dati Numerazione automatica rappresenta spesso una chiave primaria appropriata poiché garantisce l'univocità di tutti gli ID prodotto.

In alcuni casi è possibile utilizzare due o più campi che insieme costituiscono la chiave primaria di una tabella. In una tabella Dettagli sugli ordini in cui sono memorizzate le voci d'ordine potrebbero, ad esempio, essere utilizzate come chiave primaria due colonne, ovvero ID ordine e ID prodotto. Le chiavi primarie costituite da più colonne vengono inoltre definite chiavi composte.

Per il database relativo alle vendite di prodotti è possibile creare una colonna Numerazione automatica per ognuna delle tabelle utilizzate come chiave primaria: IDProdotto per la tabella Prodotti, IDOrdine per la tabella Ordini, IDCliente per la tabella Clienti e IDFornitore per la tabella Fornitori.

Immagine che illustra elementi di informazioni durante il processo di progettazione

Torna all'inizio Torna all'inizio

Creazione di relazioni tra tabelle

Dopo avere suddiviso le informazioni in tabelle, è necessario riunire di nuovo tali informazioni nei modi appropriati. Nella maschera seguente, ad esempio, sono incluse informazioni recuperate da diverse tabelle.


Maschera Ordini

Callout 1 Le informazioni nella maschera provengono dalla tabella Clienti...
Callout 2 ...dalla tabella Dipendenti...
Callout 3 ...dalla tabella Ordini...
Callout 4 ...dalla tabella Prodotti...
Callout 5 ...e dalla tabella Dettagli sugli ordini.

Access è un sistema di gestione di database relazionali. In un database relazionale le informazioni vengono suddivise in tabelle distinte in base all'argomento. Le relazioni tra tabelle vengono quindi utilizzate per riunire le informazioni secondo le esigenze.

Torna all'inizio Torna all'inizio

Creazione di una relazione uno-a-molti

Si consideri l'esempio seguente, in cui il database relativo ai prodotti ordinati include le tabelle Fornitori e Prodotti. Un fornitore può fornire una quantità qualsiasi di prodotti. Di conseguenza, per qualsiasi fornitore rappresentato nella tabella Fornitori possono essere rappresentati molti prodotti nella tabella Prodotti. Tra la tabella Fornitori e la tabella Prodotti esiste pertanto una relazione uno-a-molti.

Concetto di uno-a-molti

Per rappresentare una relazione uno-a-molti nella progettazione del database, aggiungere la chiave primaria del lato "uno" della relazione come colonna o colonne aggiuntive alla tabella sul lato "molti" della relazione. In questo caso, ad esempio, si aggiunge la colonna ID fornitore dalla tabella fornitori alla tabella Prodotti. Il numero di ID fornitore potrà quindi essere utilizzato da Access nella tabella Prodotti per individuare il fornitore corretto per ogni prodotto.

La colonna ID fornitore nella tabella Prodotti è detta chiave esterna. Una chiave esterna è un'ulteriore chiave primarie della tabella. La colonna ID fornitore nella tabella Prodotti è una chiave esterna, in quanto è anche la chiave primaria della tabella Fornitori.

Elenco di elementi di informazioni durante il processo di progettazione

Per creare le basi per unire in join tabelle correlate, è necessario definire coppie di chiavi primarie e chiavi esterne. Se non si è certi delle tabelle che dovrebbero condividere una colonna comune, identificare una relazione uno-a-molti per assicurare che le due tabelle interessate richiedano in effetti una colonna condivisa.

Torna all'inizio Torna all'inizio

Creazione di una relazione molti-a-molti

Si consideri la relazione tra una tabella Prodotti e una tabella Ordini.

Un singolo ordine può includere più prodotti, mentre un singolo prodotto può essere incluso in molti ordini. A ogni record della tabella Ordini possono pertanto corrispondere molti record della tabella Prodotti e a ogni record della tabella Prodotti possono corrispondere molti record della tabella Ordini. Questo è un tipo di relazione molti-a-molti, poiché a qualsiasi prodotto possono corrispondere molti ordini e a qualsiasi ordine possono corrispondere molti prodotti. Per rilevare le relazioni molti-a-molti tra le tabelle, è importante considerare entrambi i lati della relazione.

Gli argomenti delle due tabelle, Ordini e Prodotti, sono collegati da una relazione molti-a-molti e ciò rappresenta un problema. Per comprendere il problema, si immagini cosa accadrebbe se si tentasse di creare la relazione tra le due tabelle aggiungendo il campo ID prodotto alla tabella Ordini. Per inserire più prodotti per ogni ordine, nella tabella Ordini deve essere presente più di un record per ordine. Si dovrebbero ripetere le informazioni relative agli ordini per ogni riga correlata a un singolo ordine, ottenendo una progettazione inefficiente che potrebbe generare dati non corretti. Lo stesso problema si verifica se si inserisce il campo ID ordine nella tabella Prodotti, poiché nella tabella Prodotti sarebbe presente più di un record per ogni prodotto. Di seguito viene descritto come risolvere il problema.

Creare una terza tabella, in genere denominata tabella di collegamento, che consente di suddividere la relazione molti-a-molti in due relazioni uno-a-molti. Nella terza tabella viene inserita la chiave primaria di ognuna delle due tabelle, registrando così ogni occorrenza o istanza della relazione.

Relazione molti-a-molti

Ogni record nella tabella Dettagli sugli ordini rappresenta una voce in un ordine. La chiave primaria della tabella Dettagli sugli ordini è costituita da due campi, le chiavi esterne delle tabelle Ordini e Prodotti. Non è possibile utilizzare il campo ID ordine da solo come chiave primaria per questa tabella, poiché a un ordine possono corrispondere più voci. L'ID ordine viene ripetuto per ogni voce di un ordine, di conseguenza il campo non contiene valori univoci. Non è possibile utilizzare nemmeno il campo ID prodotto da solo, in quanto un prodotto più essere presente in molti ordini diversi. Utilizzati insieme, tuttavia, i due campi generano sempre un valore univoco per ogni record.

Nel database relativo alle vendite di prodotti la tabella Ordini e la tabella Prodotti non sono correlate direttamente, ma lo sono indirettamente tramite la tabella Dettagli sugli ordini. La relazione molti-a-molti tra ordini e prodotti è rappresentata nel database utilizzando due relazioni uno-a-molti:

  • Tra la tabella Ordini e la tabella Dettagli sugli ordini è presente una relazione uno-a-molti. A ogni ordine può corrispondere più di una voce, ma ognuna è collegata a un solo ordine.
  • Tra la tabella Prodotti e la tabella Dettagli sugli ordini è presente una relazione uno-a-molti. A ogni prodotto possono essere associate molte voci, ma ogni voce si riferisce a un solo prodotto.

Dalla tabella Dettagli sugli ordini è possibile determinare tutti i prodotti inclusi in un ordine particolare e determinare inoltre tutti gli ordini per un particolare prodotto.

Dopo avere incorporato la tabella Dettagli sugli ordini, l'elenco delle tabelle e dei campi potrebbe avere un aspetto analogo al seguente:

Elenco di elementi di informazioni durante il processo di progettazione

Torna all'inizio Torna all'inizio

Creazione di una relazione uno-a-uno

Un altro tipo di relazione disponibile è la relazione uno-a-uno. Si supponga, ad esempio, di avere l'esigenza di registrare speciali informazioni supplementari sui prodotti, che saranno utilizzate raramente o applicabili solo a pochi prodotti. Poiché tali informazioni sono raramente necessarie e poiché la loro archiviazione nella tabella Prodotti comporterebbe la presenta di spazio vuoto per ogni prodotto a cui tali informazioni non sono applicabili, si utilizzerà una tabella distinta. In modo analogo alla tabella Prodotti, verrà utilizzato IDProdotto come chiave primaria. La relazione tra questa tabella supplementare e la tabella Prodotto costituisce una relazione uno-a-uno. Per ogni record nella tabella Prodotto è presente un unico record corrispondente nella tabella supplementare. Quando si identifica tale relazione, entrambe le tabelle devono condividere un campo comune.

Quando si rileva l'esigenza di impostare una relazione uno-a-uno nel database, verificare che sia possibile inserire le informazioni dalle due tabelle in una sola. Se non si desidera effettuare questa operazione per qualsiasi motivo, ad esempio perché rimarrebbe parecchio spazio vuoto, nell'elenco seguente è illustrato come verrebbe rappresentata la relazione nella progettazione:

  • Se le due tabelle condividono lo stesso argomento, è probabilmente possibile impostare la relazione utilizzando la stessa chiave primaria in entrambe le tabelle.
  • Se le due tabelle includono argomenti diversi con chiavi primarie diverse, scegliere una delle due tabelle (una qualsiasi) e inserire la relativa chiave primaria nell'altra tabella come chiave esterna.

La capacità di determinare le relazioni tra tabelle assicura che vengano utilizzata le tabelle e le colonne corrette. Quando è presente una relazione uno-a-uno o uno-a-molti, le tabelle interessate devono condividere una colonna o più colonne comuni. Quando è presente una relazione molti-a-molti, per rappresentare la relazione è necessaria una terza tabella.

Torna all'inizio Torna all'inizio

Ottimizzazione della progettazione

Dopo avere definito le tabelle, i campi e le relazioni necessari, è consigliabile creare e popolare le tabelle con dati di esempio e provare a utilizzare tali informazioni, creando query, aggiungendo nuovi record e così via. In questo modo è possibile evidenziare i potenziali problemi, ad esempio, potrebbe essere necessario aggiungere una colonna che si è dimenticato di inserire durante la fase di progettazione oppure dividere una tabella per rimuovere la duplicazione.

Verificare se è possibile utilizzare il database per ottenere le risposte desiderate. Creare bozze di maschere e report e verificare se vengono visualizzati i dati previsti. Cercare le eventuali inutili duplicazioni dei dati e, se vengono trovate, modificare la progettazione per eliminarle.

Mentre si prova a utilizzare il database iniziale, si scopriranno con tutta probabilità aree soggette a miglioramento. Di seguito sono elencati alcuni aspetti da verificare:

  • Verificare se sono state dimenticate colonne. In tal caso controllare se le informazioni sono presenti nelle tabelle esistenti. Se si tratta di informazioni relative ad altri argomenti, potrebbe essere necessario creare un'altra tabella. Creare una colonna per ogni elemento di informazioni di cui è necessario tenere traccia. Se non è possibile calcolare le informazioni da altre colonne, è probabile che sia necessario creare una nuova colonna a tale scopo.
  • Stabilire se sono presenti colonne non necessarie, poiché possono essere calcolate da campi esistenti. Se un elemento di informazioni può essere calcolato da altre colonne esistenti, ad esempio un prezzo scontato calcolato dal prezzo al dettaglio, è in genere preferibile procedere in tal modo, evitando di creare nuove colonne.
  • Verificare se vengono immesse ripetutamente informazioni duplicate in una delle tabelle. In tal caso è probabilmente necessario dividere la tabella in due tabelle con una relazione uno-a-molti.
  • Verificare se nelle tabelle sono presenti molti campi, un numero limitato di record e molti campi vuoti nei singoli record. In tal caso, considerare la possibilità di riprogettare la tabella in modo che contenga meno campi e record.
  • Verificare se ogni elemento di informazioni è stato suddiviso in parti utili più piccole. Se è necessario creare report oppure applicare criteri di ordinamento o eseguire ricerche o calcoli su un elemento di informazioni, inserire tale elemento in una colonna corrispondente.
  • Verificare se ogni colonna contiene dati relativi all'argomento della tabella. Se una colonna non contiene informazioni sull'argomento di una tabella, appartiene a una tabella diversa.
  • Verificare che tutte le relazioni tra tabelle siano rappresentate da campi comuni o da una terza tabella. Le relazioni uno-a-uno e uno-a-molti- richiedono colonne comuni. Le relazioni molti a molti richiedono una terza tabella.

Ottimizzazione della tabella Prodotti

Si supponga che ogni prodotto nel database relativo alle vendite di prodotti rientri in una categoria generale, ad esempio Bevande, Condimenti o Pesce. Nella tabella Prodotti è possibile inserire un campo che visualizzi la categoria per ogni prodotto.

Si supponga che dopo avere esaminato e ottimizzato la progettazione del database si decida si archiviare una descrizione della categoria insieme al relativo nome. Se si aggiunge un campo Descrizione categoria alla tabella Prodotti, sarà necessario ripetere ogni descrizione di categoria per ogni prodotto che rientra in tale categoria, una soluzione non certo ottimale.

Una soluzione migliore consiste nell'impostare Categorie come nuovo argomento di cui tenere traccia nel database, con una tabella e una chiave primaria personalizzate. Sarà quindi possibile aggiungere la chiave primaria dalla tabella Categorie alla tabella Prodotti come chiave esterna.

Le tabelle Categorie e Prodotti sono collegate mediante una relazione uno-a-molti, infatti una categoria può includere più prodotti, ma un prodotto può appartenere a una sola categoria.

Quando si esaminano le strutture delle tabelle, prestare attenzione agli eventuali gruppi ripetuti. Si consideri ad esempio una tabella contenente le colonne seguenti:

  • ID prodotto
  • Nome
  • ID Prodotto1
  • Nome1
  • ID prodotto2
  • Nome2
  • ID prodotto3
  • Nome3

Ogni prodotto è un gruppo ripetuto di colonne che differiscono dalle altre solo aggiungendo un numero alla fine del nome della colonna. Se si osservano colonne con questa numerazione, è consigliabile rivedere la progettazione.

Tale progettazione presenta diversi difetti. Innanzitutto, impone la definizione di un limite massimo al numero di prodotti e, quando si supera tale limite, diventa necessario aggiungere un nuovo gruppo di colonne alla struttura della tabella e ciò implica un'attività amministrativa importante.

Un altro problema è dovuto al fatto che per i fornitori con un una quantità di prodotti inferiore al numero massimo viene sprecato spazio, in quanto le colonne aggiuntive saranno vuote. Il difetto più grave di tale progettazione è che rende difficile l'esecuzione di molte attività, ad esempio l'ordinamento o l'indicizzazione della tabella per ID prodotto o per nome.

Ogni volta che si rilevano gruppi ripetuti, è consigliabile rivedere attentamente la progettazione considerando la possibilità di dividere la tabella in due. Nell'esempio precedente è preferibile utilizzare due tabelle, una per i fornitori e una per i prodotti, collegate mediante l'ID fornitore.

Torna all'inizio Torna all'inizio

Applicazione delle regole di normalizzazione

Come passaggio successivo del processo di progettazione, è possibile applicare regole di normalizzazione dei dati, dette a volte semplicemente regole di normalizzazione, che consentono di verificare se le tabelle sono strutturate correttamente. Il processo di applicazione delle regole alla progettazione del database è detto normalizzazione del database o solo normalizzazione.

La normalizzazione risulta utile soprattutto dopo che sono stati rappresentati tutti gli elementi di informazioni e avere creato la progettazione preliminare. Consente di verificare che gli elementi di informazioni siano stati suddivisi nelle tabelle appropriate, ma non può invece assicurare che siano stati inseriti tutti gli elementi di dati corretti con cui iniziare.

Applicare le regole in successione, verificando a ogni passaggio che la progettazione raggiunga una di quelle che vengono definite "forme normali". In genere vengono ampiamente accettate cinque forme normali, dalla prima alla quinta. In questo articolo vengono considerate solo le prime tre, in quanto rappresentano i requisiti necessari per la maggior parte delle progettazioni di database.

Prima forma normale

La prima forma normale specifica che a ogni intersezione di riga e colonna nella tabelle è presente un singolo valore e mai un elenco di valori. Ad esempio non è possibile avere un campo denominato Prezzo con cui siano presenti più prezzi. Se si considera ogni intersezione di riga e colonna come una cella, ogni cella può contenere un solo valore.

Seconda forma normale

La seconda forma normale richiede che ogni colonna non chiave sia completamente dipendente dall'intera chiave primaria e non solo da una parte di tale chiave. Questa regola viene applicata quando si dispone di una chiave primaria composta da più di una colonna. Si supponga ad esempio di avere una tabella contenente le colonne seguenti, dove ID ordine o ID prodotto costituisce la chiave primaria:

  • ID ordine (chiave primaria)
  • ID prodotto (chiave primaria)
  • Nome prodotto

Questa progettazione viola la seconda forma normale, in quanto Nome prodotto è dipendente da ID prodotto ma non da ID ordine, quindi non è dipendente dall'intera chiave primaria. È necessario rimuovere Nome prodotto dalla tabella, in quanto appartiene a un'altra tabella (Prodotti).

Terza forma normale

La terza forma normale richiede non solo che ogni colonna non chiave sia dipendente dall'intera chiave primaria, ma che le colonne non chiave siano indipendenti le une dalle altre.

In altre parole, ogni colonna non chiave deve essere dipendente dalla chiave primaria ed esclusivamente dalla chiave primaria. Si supponga ad esempio di avere una tabella che contiene le colonne seguenti:

  • IDProdotto (chiave primaria)
  • Nome
  • PDC
  • Sconto

Si supponga che la colonna Sconto dipenda dal prezzo al dettaglio consigliato (PDC). Questa tabella viola la terza forma normale poiché una colonna non chiave, Sconto, dipende da un'altra colonna non chiave, PDC. Indipendenza delle colonne significa che deve essere possibile modificare qualsiasi colonna non chiave senza influire su qualsiasi altra colonna. Se si modifica un valore nel campo PDC, il valore di Sconto verrebbe modificato di conseguenza, violando in tal modo la regola. In questo caso è necessario spostare la colonna Sconto in un'altra tabella la cui chiave primaria è basata sulla colonna PDC.

Torna all'inizio Torna all'inizio

 
 
Si applica a:
Access 2010