Il problema
Capisco dalla tua domanda che si memorizzano le relazioni tra due entità (identificate da un numero compreso tra 1 e 16) e che si desidera evitare i dati ridondanti.
Facciamo un esempio per chiarire la situazione:
IdFrom TownFrom IdTo TownTo Transport Duration
--------------------------------------------------------------------
1 Paris 2 London Plane 2
1 Paris 2 London Train 2
1 Paris 2 Munich Train 8
1 Paris 2 Munich Plane 2
2 Munich 3 Zagreb Plane 3
....
Qui vediamo che se conosci solo parte del suo campo, possiamo indovinare gli altri. In effetti, vediamo che ogni Id
è un numero compreso tra 1 e 16 (o più) e corrisponde sempre a una città.
La soluzione
La soluzione è esattamente ciò a cui stai pensando: utilizzando due tabelle e una relazione di chiave esterna. Avresti quindi due tabelle che sono molto più sottili:
Quindi, ad esempio, nella tua logica hai una mappatura tra il tuo campo numerico (qui id) e dati aggiuntivi (qui città, ma potrebbe essere molto di più):
Id Town
------------
1 Paris
2 London
3 Munich
...
e
IdFrom IdTo Transport Duration
--------------------------------------
1 2 Plane 2
1 2 Train 2
1 2 Train 8
1 2 Plane 2
2 3 Plane 3
....
La chiave primaria della prima tabella è Id
, e servirebbe come chiave esterna nella seconda tabella (per colonne IdFrom
e IdTo
)
Conclusione
Questo processo di rimozione della ridondanza è chiamato normalizzazione. L'uso di un modulo normale è in generale una buona pratica per i database relazionali. Ha alcuni vantaggi:
- Ogni tabella contiene dati direttamente correlati
- Puoi ancora avere le informazioni complete, unendo le due tabelle (ok, con due chiavi esterne alla stessa tabella, è un po 'più complicato in SQL, ma fortunatamente StackOverflow ti aiuterà )
- Eviti le incongruenze (ad esempio con la tabella denormalizzata potresti avere errori di battitura come
1 Munich 2 London
, quindi 1 Parigi o Monaco?)
- Devi modificare i dati solo in un posto (ad esempio, se decidessi che il nome della città debba essere memorizzato nella sua lingua originale, come Monaco invece di Monaco, dovrai aggiornarlo una volta e tutto il i dati rimangono coerenti).
- Puoi lasciare che il database si occupi della coerenza (ad es. non sopprimere l'id di una città se è ancora usato da qualche parte).