Progettazione di database relazionali con una tabella con informazioni ridondanti

-2

Sto creando una tabella di database che memorizzerà un singolo numero da 1 a 16 in 2 campi (ci saranno molte righe di dati).

Sto cercando di evitare la duplicazione di molti dati e di rendere il mio database più efficiente. Posso creare una tabella separata con 1 colonna con i numeri da 1 a 16 inseriti, quindi utilizzare questa colonna come chiave esterna per la prima tabella?

    
posta Bkin77 18.08.2018 - 15:50
fonte

1 risposta

1

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).
risposta data 18.08.2018 - 17:45
fonte

Leggi altre domande sui tag