Domanda

Nuovo nel database e quindi non arrabbiarsi con domande semplici.Per quanto riguarda le mie conoscenze raccolte e cercate su Google, la normalizzazione riduce la ridondanza dei dati e aumenta le prestazioni.Ma in realtà, non ho capito quale sia il motivo esatto per dividere la tabella principale in altre piccole tabelle, applicare relazioni tra loro, recuperare i dati utilizzando tutte le possibili unioni, sottoquery, join ecc., Perché non possiamo avere tutti i dati in un'unica tabella e recuperarli come richiesto.Sono un po' confuso.

È stato utile?

Soluzione

Il motivo principale è quello di eliminare la ripetizione dei dati, così per esempio se si ha un utente con più indirizzi e memorizzate queste informazioni in un unico tavolo le informazioni utente potrebbe essere duplicata insieme ad ogni voce di indirizzo. La normalizzazione dovrebbe separare gli indirizzi nella propria tabella e poi collegare le due chiavi usando. In questo modo non avrebbe bisogno di duplicare i dati degli utenti, e la struttura db diventa un po 'più pulito.

normalizzazione completa generalmente non migliorare le prestazioni, in effetti spesso può peggiorare la situazione, ma non mancherà di tenere i tuoi dati duplicati gratis. Infatti in alcuni casi particolari che ho denormalizzato alcuni dati specifici, al fine di ottenere un aumento delle prestazioni.

Altri suggerimenti

La normalizzazione viene dal concetto matematico di essere "normale". Un'altra parola sarebbe "perpendicolari". Immaginare un sistema di coordinate regolare due assi. Salendo cambia solo la coordinata y, spostandosi verso il lato cambia solo la coordinata x. Così ogni movimento può essere suddiviso in un lato e un movimento dall'alto verso il basso. Questi due sono indipendenti l'uno dall'altro.

La normalizzazione nel database significa essenzialmente la stessa cosa: se si cambia un dato, questo dovrebbe cambiare solo un unico pezzo di informazioni in un database. Immaginate un database di e-mail: Se si memorizza l'ID e il nome del destinatario nella tabella mail, ma la tabella Utenti associa anche il nome alla ID, che significa che se si cambia un nome utente, che fai non solo devono cambiare nella tabella degli utenti, ma anche in ogni singolo messaggio che questo utente è coinvolto con. Così, l'asse "messaggio" e l'asse "utente" non sono "perpendicolari" o "normale".

Se d'altra parte, la tabella Mails ha solo l'ID utente, qualsiasi modifica al nome utente applicherà automaticamente a tutti i messaggi, perché in recupero di un messaggio, tutte le informazioni dell'utente vengono raccolti dalla tabella Utenti (da mezzi di un join).

La normalizzazione del database è, nella sua forma più semplice, un modo per ridurre al minimo la ridondanza dei dati.Per raggiungere questo obiettivo esistono alcune forme di normalizzazione.

La prima forma normale può essere riassunta come:

  • nessun gruppo ripetitivo in tabelle singole.
  • tabelle separate per le informazioni correlate.
  • tutti gli elementi in una tabella relativi alla chiave primaria.

La seconda forma normale aggiunge un'altra restrizione, sostanzialmente questa ogni colonna che non fa parte di una chiave candidata deve dipendere da ogni chiave candidata (una chiave candidata viene definita come un insieme minimo di colonne che non può essere duplicato nella tabella).

E in questo la terza forma normale va un po' oltre ogni colonna che non fa parte di una chiave candidata non deve dipendere da nessun'altra colonna non chiave candidata. In altre parole, può dipendere soltanto sulle chiavi candidate.Questo porta a dire che 3NF dipende dalla chiave, dall'intera chiave e da nient'altro che la chiave, quindi aiutami Codd1.

Tieni presente che le spiegazioni di cui sopra sono adattate alla tua domanda piuttosto che ai teorici dei database, quindi le descrizioni sono necessariamente semplificate (e ho usato frasi come "riassunto come" e "sostanzialmente").

Il campo della teoria dei database è complesso e, se vuoi veramente capirlo, prima o poi dovrai arrivare alla scienza che sta dietro ad esso.Ma, per quanto riguarda la tua domanda, si spera che questo sia adeguato.

La normalizzazione è uno strumento prezioso per garantire che non siano presenti dati ridondanti (il che diventa un vero problema se le due aree ridondanti non sono sincronizzate).Generalmente non aumenta le prestazioni.

Infatti, anche se tutti i database dovrebbero iniziare in 3NF, a volte è accettabile passare a 2NF per migliorare le prestazioni, a condizione che tu sia consapevole e mitighi i potenziali problemi.

E sappi che ci sono anche livelli di normalizzazione "più alti" come (ovviamente) quarto, quinto e sesto, ma anche Boyce-Codd e alcuni altri che non riesco a ricordare a memoria.Nella stragrande maggioranza dei casi, 3NF dovrebbe essere più che sufficiente.


1 Se non sai chi è Edgar Codd (o Christopher Date, del resto), probabilmente dovresti fare una ricerca su di loro, sono i padri della teoria dei database relazionali.

Usiamo la normalizzazione per ridurre le possibilità di anomalie che possono insorgere a seguito di inserimento dei dati, la cancellazione, updation. Normalizzazione doesnt necessariamente aumentare le prestazioni.

C'è molto materiale su internet così non lo vorrei ripetere la roba di nuovo qui. Ma si può avere uno sguardo a regole di normalizzazione Anomalie  (Altri aswell)

Oltre a tutto quanto sopra, rende solo un certo senso. Diciamo che avete un utente e si desidera registrare che tipo di macchina che hanno.

Metti che tutto in un unico tavolo e poi stai bene, fino a quando qualcuno possiede due auto ... Si sta quindi andando ad avere bisogno due file per quella persona, e un modo di fare in modo che è possibile collegare questi due file insieme ...

E poi che cosa succede se si desidera anche registrare quanti cani hanno? Stesso tavolo con un sacco di dups confusione? Un altro tavolo con la logica personalizzata proprio per gestire utenti unici?

La normalizzazione ti tiene lontano da un sacco di questi problemi ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top