Per creare una relazione molti a molti con tabella ponte in Access devi trasformare il rapporto molti-a-molti in due relazioni uno-a-molti. La tabella ponte contiene almeno le foreign key delle due tabelle principali e, quando serve, i campi che descrivono la relazione stessa.
Indice
- Perché serve la tabella ponte
- Esempio Ordini e Prodotti
- Creare le tabelle
- Definire le chiavi
- Creare le relazioni
- Integrità referenziale
- Chiave composta o Autonumerazione
- Indici univoci
- Query multi-tabella
- Maschere e sottomaschere
- Troubleshooting
- FAQ
Che cos’è una relazione molti a molti
Una relazione molti-a-molti esiste quando ogni record della prima tabella può essere collegato a molti record della seconda e viceversa. Un ordine contiene molti prodotti e lo stesso prodotto può comparire in molti ordini. Studenti e Corsi, Autori e Libri, Dipendenti e Progetti sono altri esempi.
In un database relazionale non si rappresenta correttamente questo rapporto mettendo molte colonne ripetute nella stessa tabella. Serve una tabella intermedia.
Perché Prodotto1, Prodotto2, Prodotto3 è sbagliato
Se Ordini contiene colonne Prodotto1, Prodotto2 e Prodotto3, stai imponendo un numero massimo arbitrario di prodotti e rendi difficili query, totali e manutenzione. Aggiungere Prodotto4 richiederebbe cambiare la struttura. È un tipico segnale di mancata normalizzazione.
La soluzione: DettagliOrdine
Crea una tabella DettagliOrdine con almeno IDOrdine e IDProdotto. Aggiungi Quantita, PrezzoUnitario, Sconto e altri campi che appartengono alla specifica combinazione ordine-prodotto.
Lo schema diventa Ordini 1→∞ DettagliOrdine e Prodotti 1→∞ DettagliOrdine.
Struttura consigliata
Ordini: IDOrdine Autonumerazione, IDCliente Numero/Intero lungo, DataOrdine. Prodotti: IDProdotto Autonumerazione, Codice, Descrizione, PrezzoListino. DettagliOrdine: IDDettaglio Autonumerazione opzionale, IDOrdine Numero/Intero lungo, IDProdotto Numero/Intero lungo, Quantita, PrezzoUnitario, Sconto.
Creare la prima relazione
- Apri Strumenti database > Relazioni.
- Aggiungi Ordini, Prodotti e DettagliOrdine.
- Trascina Ordini.IDOrdine su DettagliOrdine.IDOrdine.
- Seleziona Applica integrità referenziale.
- Conferma.
Creare la seconda relazione
- Trascina Prodotti.IDProdotto su DettagliOrdine.IDProdotto.
- Verifica i tipi.
- Applica integrità referenziale.
- Conferma e salva.
Ora DettagliOrdine non può contenere un IDOrdine inesistente né un IDProdotto inesistente, salvo configurazioni particolari.
Chiave primaria della tabella ponte
Hai due strategie comuni. La prima usa una chiave composta IDOrdine+IDProdotto. La seconda usa IDDettaglio Autonumerazione come primaria e crea un indice univoco sulla coppia IDOrdine+IDProdotto se la stessa combinazione non deve ripetersi.
Quando usare una chiave composta
È elegante quando la coppia identifica naturalmente la riga e nessun’altra tabella deve riferirsi direttamente al singolo dettaglio. Riduce la necessità di un ID artificiale aggiuntivo.
Quando usare IDDettaglio
È comodo quando altre tabelle devono collegarsi alla riga, per esempio LottiDettaglio, Resi o Seriali. In questo caso conserva comunque un indice univoco sulla coppia se il business non permette due righe separate per lo stesso prodotto nello stesso ordine.
Quando la coppia può ripetersi
In alcuni processi può essere legittimo avere lo stesso prodotto in più righe dello stesso ordine, per esempio lotti differenti, prezzi differenti o note diverse. Non imporre un vincolo univoco se contraddice la realtà aziendale. La regola va decisa prima della struttura.
Tipi dati
Se IDOrdine e IDProdotto sono Autonumerazione nelle tabelle padre, nella tabella ponte le foreign key sono normalmente Numero/Intero lungo. Non usare due nuove Autonumerazioni come foreign key.
Query di esempio
SELECT Ordini.IDOrdine, Prodotti.Descrizione, DettagliOrdine.Quantita, DettagliOrdine.PrezzoUnitario FROM (Ordini INNER JOIN DettagliOrdine ON Ordini.IDOrdine=DettagliOrdine.IDOrdine) INNER JOIN Prodotti ON DettagliOrdine.IDProdotto=Prodotti.IDProdotto;
Questa query restituisce una riga per ogni prodotto presente in ogni ordine.
Calcolare il totale riga
Puoi aggiungere un campo calcolato nella query:
TotaleRiga: [Quantita]*[PrezzoUnitario]*(1-Nz([Sconto],0))
La formula precisa dipende da come memorizzi lo sconto. Evita di salvare totali derivabili se non hai una ragione funzionale precisa.
Maschera Ordini con sottomaschera
La soluzione più naturale è una maschera principale Ordini e una sottomaschera DettagliOrdine. Collega Master/Child tramite IDOrdine. Nella sottomaschera usa una combo per scegliere il prodotto, mostrando Descrizione ma salvando IDProdotto.
Mostrare descrizioni e salvare ID
Una combo può avere origine riga su Prodotti e colonna associata IDProdotto. L’utente vede Codice e Descrizione, ma Access memorizza la foreign key stabile.
Integrità referenziale
È particolarmente importante nelle tabelle ponte. Senza integrità, potresti avere righe che puntano a ordini o prodotti non esistenti. Prima di applicarla su dati esistenti cerca orfani.
Query per trovare dettagli senza ordine
SELECT DettagliOrdine.* FROM DettagliOrdine LEFT JOIN Ordini ON DettagliOrdine.IDOrdine=Ordini.IDOrdine WHERE Ordini.IDOrdine IS NULL;
Query per trovare dettagli senza prodotto
SELECT DettagliOrdine.* FROM DettagliOrdine LEFT JOIN Prodotti ON DettagliOrdine.IDProdotto=Prodotti.IDProdotto WHERE Prodotti.IDProdotto IS NULL;
Eliminazione a catena
Valuta separatamente le due relazioni. Se elimini un ordine, può avere senso eliminare i suoi dettagli perché non hanno significato senza l’ordine. Se elimini un prodotto, invece, potresti voler impedire la cancellazione se compare nello storico ordini e usare un campo Disattivo.
Aggiornamento a catena
Con chiavi Autonumerazione normalmente non serve. Se usi chiavi naturali modificabili, può essere utile, ma una chiave tecnica stabile riduce i cambiamenti.
Molti-a-molti Studenti-Corsi
Crea Iscrizioni con IDStudente, IDCorso, DataIscrizione, Esito. Le relazioni sono Studenti 1:N Iscrizioni e Corsi 1:N Iscrizioni. DataIscrizione appartiene alla relazione fra studente e corso.
Molti-a-molti Autori-Libri
Crea AutoriLibri con IDAutore, IDLibro e magari OrdineFirma. Lo stesso libro può avere molti autori e lo stesso autore molti libri.
Molti-a-molti Dipendenti-Progetti
Crea DipendentiProgetti con IDDipendente, IDProgetto, Ruolo, OrePreviste. Ruolo e ore appartengono alla partecipazione del dipendente a quel progetto.
Normalizzazione
La tabella ponte è una conseguenza naturale della normalizzazione. Evita colonne ripetute, separa entità e rappresenta correttamente le relazioni.
Prestazioni e indici
Le foreign key della tabella ponte vengono usate spesso nei join. Valuta indici che consentono duplicati sui singoli campi e un indice composto univoco se necessario. Misura le prestazioni sul database reale.
Query totali
Per sommare le quantità per prodotto usa GROUP BY su IDProdotto. Per contare quanti prodotti distinti ha un ordine, puoi usare query dedicate. La struttura normalizzata rende queste analisi molto più semplici.
Errore: righe duplicate
Se la stessa coppia Ordine-Prodotto compare più volte e non dovrebbe, crea prima una query per trovare duplicati, correggili e poi applica un indice univoco composto.
Errore: Access non crea l’integrità
Controlla tipi dati, dimensioni, orfani e primarie delle tabelle padre. Con Autonumerazione, la foreign key deve normalmente essere Numero/Intero lungo.
Errore: una foreign key è Autonumerazione
Correggila. La foreign key deve ricevere l’ID del padre; non deve generare un valore indipendente.
Database front-end/back-end
Se le tabelle risiedono in un back-end Access condiviso, crea le relazioni nel back-end. Ogni utente dovrebbe usare un front-end locale. Se il back-end è SQL Server, definisci le foreign key sul server.
Access Microsoft 365 e Access 2024
La progettazione descritta vale per Access desktop su Windows, inclusi Microsoft 365 e Access 2024. 32/64 bit non cambia il modello. Runtime esegue l’applicazione ma non è l’ambiente principale di progettazione.
Access non dispone di una versione desktop nativa equivalente per macOS.
Documentare la tabella ponte
Scrivi chiaramente quali due entità collega, quali foreign key usa, quale combinazione deve essere univoca e quali attributi appartengono alla relazione. Una buona documentazione evita che in futuro qualcuno tenti di spostare Quantità nella tabella Prodotti.
Checklist
- Hai identificato il vero molti-a-molti.
- Hai creato una tabella ponte.
- Le foreign key hanno tipo corretto.
- Le due relazioni sono 1:N.
- L’integrità è applicata.
- La regola sui duplicati è definita.
- La chiave primaria della ponte è appropriata.
- Maschere e combo salvano ID.
- Query e report sono testati.
FAQ
Access supporta molti-a-molti?
Sì, modellandolo con una tabella ponte.
Devo usare sempre una Autonumerazione nella ponte?
No. Dipende dalle necessità.
Posso usare una chiave composta?
Sì, quando la coppia identifica univocamente la riga.
Devo attivare eliminazione a catena?
Non automaticamente. Valuta il significato dei dati.
32/64 bit cambia qualcosa?
No per il modello relazionale.
Link utili
Consulta la categoria Guide Access, creare una tabella ponte, relazioni molti-a-molti e integrità referenziale.
Fonte Microsoft: Create a query based on multiple tables e Guide to table relationships.
Conclusione
Creare una relazione molti a molti con tabella ponte in Access è il modo corretto per rappresentare entità che possono collegarsi reciprocamente più volte. La tabella intermedia rende esplicite le foreign key, permette di memorizzare attributi della relazione e semplifica query, maschere e integrità dei dati.