2009-07-09 19 views
12

Nuovo al database e quindi non essere turbato da semplici domande. Per quanto riguarda la normalizzazione della conoscenza su Google e raccolta, riduce la ridondanza dei dati e aumenta le prestazioni. Ma davvero, non ho capito quale sia la ragione esatta per dividere la tabella principale in altri piccoli tavoli, applicando la relazione tra di loro, recuperando i dati utilizzando tutti i possibili sindacati, sottoquery, join ecc., Perché non possiamo avere tutti i dati in un unico tavolo e recuperarli come richiesto. Sono un po 'confuso.Che cosa fa esattamente la normalizzazione del database?

+0

Sede [questo] (http://omtlab.com/database-what-is-normalization/). –

risposta

15

Il motivo principale è eliminare la ripetizione dei dati, ad esempio se si dispone di un utente con più indirizzi e si memorizzano queste informazioni in un'unica tabella, le informazioni dell'utente verranno duplicate insieme a ciascuna voce di indirizzo. La normalizzazione separerebbe gli indirizzi nella propria tabella e quindi collegherebbe i due tasti usando. In questo modo non avrai bisogno di duplicare i dati dell'utente e la tua struttura di database diventa un po 'più pulita.

Normalmente la completa normalizzazione non migliora le prestazioni, spesso può peggiorare le prestazioni ma manterrà i dati duplicati gratuitamente. Infatti in alcuni casi speciali ho denormalizzato alcuni dati specifici per ottenere un aumento delle prestazioni.

+0

quindi se non vi è alcuna duplicazione non si dovrebbe normalizzare? – IAdapter

+0

Se si avesse solo un elenco di utenti con un solo indirizzo, non sarebbe necessario suddividere i dati in più tabelle. Vorrei ancora consigliare l'utilizzo di una chiave univoca per quei dati. –

+0

La normalizzazione implica "eliminare la ripetizione dei dati", ma quella frase quotidiana è inutilmente vaga, mentre la normalizzazione in realtà * definisce * una cosa specifica che si può ragionevolmente chiamare. (Ad esempio, abilitare gli aggiornamenti tramite una riga più breve ha bisogno di più righe più lunghe.) (Cioè "elimina le anomalie di aggiornamento".) Il tuo esempio doe * not * ha bisogno di essere normalizzato e non lo hai normalizzato. Inoltre non è una "ripetizione" che è necessariamente cattiva. Anche la normalizzazione non introduce nuove colonne, cioè le chiavi, come nel tuo esempio. Ad esempio, i valori ID inseriti "ripetono" dove sono stati sostituiti esattamente come gli indirizzi. – philipxy

4

Utilizziamo la normalizzazione per ridurre le possibilità di anomalie che potrebbero derivare dall'inserimento, eliminazione, aggiornamento dei dati. La normalizzazione non necessariamente aumenta le prestazioni.

C'è molto materiale su Internet, quindi non ripeterò più qui. Ma si può avere uno sguardo a Normalization rules Anomalies (altri partecipavano)

6

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

prima forma normale possono essere riassunti come:

  • gruppi ripetuti in singole tabelle.
  • tabelle separate per informazioni correlate.
  • tutti gli elementi in una tabella correlata alla chiave primaria.

Seconda forma normale aggiunge un'altra restrizione, fondamentalmente, che ogni colonna non parte di una chiave candidato deve essere dipendente da ogni candidato chiave (una chiave candidata essendo definito come un insieme minimo di colonne che non può essere duplicato in la tavola).

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

Nota che le spiegazioni di cui sopra sono adattate alla tua domanda piuttosto che ai teorici del database, quindi le descrizioni sono necessariamente semplificate (e ho usato frasi come "riepilogato come" e "fondamentalmente").

Il campo della teoria dei database è complesso e, se davvero vuoi capirlo, alla fine dovrai arrivare alla scienza. Ma, in termini di domanda, spero che questo sia adeguato.

La normalizzazione è uno strumento prezioso per garantire che non si disponga di dati ridondanti (che diventa un problema reale se le due aree ridondanti non sono sincronizzate). Generalmente non aumenta le prestazioni.

Infatti, anche se tutto il database dovrebbe iniziare in 3NF, a volte è accettabile passare a 2NF per ottenere miglioramenti delle prestazioni, a condizione di essere a conoscenza e di mitigare i potenziali problemi.

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


Se non sapete chi Edgar Codd (o Christopher data, se è per questo) è, probabilmente si dovrebbe loro ricerca, sono i padri di teoria dei database relazionali.

+1

+1 per il gioco di parole Codd. – Whymarrh

+0

@philipxy, non sono sicuro del primo punto, potrei facilmente aggiungere una colonna che non ha nulla a che fare con una chiave (ad esempio, un numero totalmente casuale) - che sicuramente violerebbe 1nf, sì? Per quanto riguarda il secondo punto, non riesco a vedere "primario" da nessuna parte nella mia risposta, anche se la frase "la chiave" può trarre in inganno in questa direzione.Se hai un'idea su come evitarlo, fammelo sapere, altrimenti farò un tentativo quando arriverò su un vero computer. – paxdiablo

+0

Ri 1: No, non è così. La normalizzazione non riguarda un termine vago di tutti i giorni come "non ha nulla a che fare con". Un termine specifico con definizione specifica che * è * rilevante è "funzionalmente dipende da".) (Immagino per "chiave" intendi CK (chiave candidata). Una * definizione * di CK è un set di colonne le cui attività secondarie sono uniche e che non contiene un set di colonne più piccolo le cui attività secondarie sono univoche.Per "ogni colonna dipende da ogni tasto" vedere i miei commenti su altre risposte – philipxy

9

La normalizzazione deriva dal concetto matematico di "normale". Un'altra parola sarebbe "perpendicolare". Immagina un normale sistema di coordinate a due assi. Salire semplicemente cambia la coordinata y, spostandosi di lato cambia semplicemente la coordinata x. Quindi ogni movimento può essere suddiviso in un movimento laterale e un movimento in alto. Questi due sono indipendenti l'uno dall'altro.

La normalizzazione nel database significa essenzialmente la stessa cosa: se si modifica un dato, questo dovrebbe cambiare solo una singola informazione in un database. Immaginate un database di E-Mails: se memorizzate l'ID e il nome del destinatario nella tabella Mails, ma la tabella Users associa anche il nome all'ID, il che significa che se modificate un nome utente, non solo devi cambiarlo nella tabella degli utenti, ma anche in ogni singolo messaggio con cui questo utente è coinvolto. Quindi, l'asse "messaggio" e l'asse "utente" non sono "perpendicolare" o "normale".

Se invece la tabella Mails ha solo l'ID utente, qualsiasi modifica al nome utente verrà applicata automaticamente a tutti i messaggi, poiché al momento del recupero di un messaggio, tutte le informazioni dell'utente vengono raccolte dalla tabella Utenti (per mezzo di un join).

1

Così come tutto quanto sopra, ha solo un certo senso. Di 'che hai un utente e vuoi registrare che tipo di macchina hanno.

Metti tutto in una tabella e poi stai bene, finché qualcuno possiede due macchine ... Avrai quindi bisogno di due file per quella persona, e un modo per assicurarti di poter collegare queste due file insieme ...

E poi se si desidera registrare anche quanti cani hanno? Stesso tavolo con un sacco di confusionari? Un'altra tabella con la tua logica personalizzata per gestire gli utenti unici?

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

+0

Non c'è niente di sbagliato di per sé con una riga per ogni indirizzo.È solo quando è presente * quando certe altre cose sono * che la normalizzazione è appropriata ... ad esempio quando abbiamo più indirizzi * e * più cani * e * non è un cane per casa o casa per cane. Quindi questo in realtà non spiega le anomalie. (Vedi i miei commenti sulla risposta di SteveTemple.) – philipxy

Problemi correlati