Esiste uno strumento per verificare se il mio database è normalizzato al terzo modulo normale?


20

Di recente ho imparato a conoscere la normalizzazione e capisco quanto sia importante quando si implementa un nuovo schema.

Come posso verificare se il mio database è conforme a 2NF o 3NF?

La revisione manuale è un'opzione sicura, ma sto cercando uno strumento automatizzato qui.

Non sto cercando uno strumento punta e clicca, più qualcosa che evidenzierebbe possibili ottimizzazioni per rendere conforme una tabella 3NF. Immagino che potrebbe usare statistiche basate su buoni dati di esempio e / o analisi semantica dei nomi delle colonne.


1
Spero che un tale strumento non esista. Non è necessario applicare 2NF / 3NF. La progettazione di uno schema / modello deve spesso tenere conto di aspetti pratici e considerazioni sulle prestazioni, che di solito tirano fuori dalla finestra
xNF

2
Significa che la normalizzazione non viene utilizzata in realtà? Ho pianificato di usarlo come punto di partenza e prenderò in considerazione la denormalizzazione quando rallenta le prestazioni.
ack__

3
La progettazione di schemi è più un'arte che una scienza. Sicuramente ci sono regole di base da seguire, ma una volta che lo fai abbastanza inizi a farti un'idea di cosa funziona e cosa no. Artigianato.
datagod

Non sono d'accordo con Phil. La normalizzazione è talvolta la strada da percorrere. Altre volte lo schema a stella è migliore. Dipende da cosa stai facendo. Avresti bisogno di un sacco di tabelle prima che l'automazione valga la pena.
Walter Mitty,

Risposte:


24

La normalizzazione è assolutamente usata nel mondo reale ... e spero che tu sappia che 3NF è solo il terzo di ... che cosa è ora, 8? Ma 3NF dovrebbe essere un obiettivo facile.

Tuttavia ... mi permetto di dire che non potrebbe esistere un simile strumento.

La normalizzazione, tecnicamente, è un attributo di ogni tabella. All'interno di un determinato database, tabelle diverse possono avere diversi livelli di normalizzazione.

Ogni tabella rappresenta i fatti ... fatti relativi alle istanze di un certo tipo di cose (persona, conto, ordine, spedizione, articolo, posizione) inclusi, a volte, chiavi esterne che portano ad altri tipi di fatti su quella cosa.

La normalizzazione ha a che fare con la precisione e l'efficienza dei fatti rappresentati nelle tabelle, nonché con la capacità del design della tabella di prevenire modelli di dati ambigui e ridondanti.

Pertanto, è necessaria una comprensione dei fatti reali ... che è al di fuori del campo di applicazione degli strumenti automatizzati.

Q: Is a table with { student, subject, instructor } in 3NF?
A: What are students, subjects and instructors?

In un mondo in cui tutti gli istruttori hanno insegnato tutte le materie e ogni studente ha potuto prendere qualsiasi combinazione, ma non più di un corso su ciascuna materia da ciascun istruttore, si può dire che questo tavolo sia in 3NF. Nel mondo reale, rivendicare 3NF per questa tabella è assurdo.

Capire che non è in 3NF richiede una comprensione della natura dei fatti che rappresenta. Nella nostra realtà, questa tabella non sarà 3NF poiché (tra le altre ragioni) la materia e l'istruttore sono associati insieme in modi che non hanno nulla a che fare con lo studente. Se abbiamo i corsi in cui gli istruttori insegnano materie memorizzate altrove nel nostro database, perché dovremmo copiare entrambi i valori qui invece di una chiave esterna dall'altra tabella che indica che lo studente è stato registrato per il corso? Se l'istruttore viene sostituito, dobbiamo modificare più record in più posizioni.

Più un database è normalizzato, più è intrinsecamente coerente con il mondo reale e con se stesso, e più è difficile che i fatti del database siano inavvertitamente falsi. La progettazione di database è un'arte, ma sicuramente è anche una scienza.

Anche se non vedo gli occhi su tutto ciò che scrive, consiglierei il libro di Chris Date, Database Design and Relational Theory: Normal Forms and All That Jazz, che affronta in modo lancinante i dettagli sulla teoria di base del modello relazionale.


2
Grazie per questa risposta dettagliata. Tuttavia, seguendo il tuo esempio, dovrebbe essere possibile che uno strumento che analizza i dati di esempio rilevi che i valori di "istruttore" vengano ripetuti molto e che compaia anche in un'altra tabella, suggerendo quindi che potrebbe essere candidato per chiave esterna o qualsiasi altra modifica che renderebbe questa tabella conforme a 3nf o mi sto perdendo qualcosa?
ack__

2
Vero, ma la parola chiave è ancora "suggerire". Uno strumento potrebbe suggerire cambiamenti strutturali cercando un'apparente ridondanza, ma continuerei a sostenere che un'autentica ridondanza e un'apparenza coincidente di correlazione sarebbero difficili da distinguere tra tali strumenti. È richiesta la conoscenza della natura del mondo reale dei dati.
Michael - sqlbot,

@ack__: essere in terza forma normale o no è una proprietà di una relazione non di una coppia o di un insieme di relazioni. Quindi non vedo che stabilire una relazione di chiave esterna abbia qualcosa a che fare con la terza forma normale.
miracolo173

Penso che il problema più grande sia che determinare dipendenze funzionali multi-colonna sia problematico esp. se i valori possono essere uguali e tuttavia rappresentare entità diverse (ovvero quando sono coinvolte chiavi composite). Prendi in considerazione una tabella: (address_text, city, state_province, mail_code, country). Ora questo non è normalizzato. (città, state_province) -> (paese). Quindi per normalizzare completamente dobbiamo suddividere questo in almeno tre tabelle, forse quattro (gestione mail_code!) Ma i tasti compositi rendono questo problema problematico da rilevare al volo. Anche comp. le chiavi sono la chiave dell'idea di nf, quindi non ignorarle!
Chris Travers,

Qualcuno potrebbe spiegare perché "In un mondo in cui uno studente ha potuto frequentare un corso in una sola materia e tutti gli istruttori hanno insegnato tutte le materie, si può dire che questa tabella sia in 3NF" Ciò sembra stabilire che gli Studenti -> materia e niente di più. Il senso che la chiave di questo tavolo sarebbe (studenti, istruttori) non distruggerebbe la 3NF? Cosa ci aiuta ogni insegnante che insegna ogni materia?
Estratto da Verlee il

5

Parte dell'uso dei metodi formali nello sviluppo della teoria relazionale era lo sviluppo di procedure che potevano essere automatizzate. Sono abbastanza sicuro che CJ Date viene fuori e lo dice nella sua Introduzione ai sistemi di database .

Diversi strumenti CASE rilasciati alla fine degli anni '80 o all'inizio degli anni '90 potrebbero derivare ogni possibile schema 5NF analizzando diagrammi ER o mediante analisi statistica dei dati di esempio.

Visio Enterprise Architect (penso) è uno strumento relativamente recente in questo senso.


Bello. Stavo davvero cercando entrambi i modi per analizzare uno schema (diagramma ER e analisi dei dati di esempio). Conosci qualche altro software recente rispetto a Visio? Non ho (ancora) una licenza per questo.
ack__

1
Ma i tuoi diagrammi ER sono essenzialmente diagrammi a oggetti. Non è esattamente la stessa cosa di prendere un database esistente e determinare se è normalizzato da esso.
Chris Travers,

2
L'analisi di tabelle con dati di esempio e suggerimenti per la normalizzazione era una caratteristica di Access e, nelle prime versioni, se ricordo bene.
ypercubeᵀᴹ

@Chris: sì, mi riferivo ai diagrammi ER solo per l'analisi semantica.
ack__

@ypercube: grazie per il suggerimento, darò un'occhiata a Access.
ack__


2

Penso che se potessi scrivere uno strumento per farlo, ci vorrebbe comunque una revisione manuale per far funzionare. i moduli normali sono definiti sulla base delle dipendenze funzionali e questi non possono essere determinati dalla semplice ispezione dei dati. In altre parole, è una questione di logica induttiva piuttosto che deduttiva per determinare se esiste una dipendenza funzionale.


In effetti ci sarà qualche revisione manuale da fare, non mi aspetto che uno strumento lo faccia in modo completamente automatico. Ma sono abbastanza sicuro che gran parte del lavoro possa essere automatizzato analizzando i dati esistenti nel DB (almeno, campioni di esso) e / o campi nome / tipo.
ack__

1
Come? La normalizzazione è definita su dipendenze di join e dipendenze funzionali. Una dipendenza funzionale è sostanzialmente facile da definire come: per ogni possibile valore di una superkey, esiste esattamente un valore nella dipendenza funzionale. Non puoi arrivarci automatizzando la revisione dei dati perché solo perché hai, per il tuo set attuale, quella che sembra essere una dipendenza funzionale, ciò non significa che una nuova chiave sarà conforme. È molto simile alla vecchia divisione correlazione vs causalità. Non è possibile indurre una dipendenza funzionale osservando ciò che è attualmente nel database.
Chris Travers,

2
almeno uno strumento può suggerire che esiste forse una relazione. se la qualità e le dimensioni del campione di dati sono sufficientemente grandi, l'accuratezza di tale ipotesi sarà sufficientemente elevata per scopi pratici.
miracle173,

Può essere. Ma facciamo un vero esempio che è piuttosto infernale dal punto di vista del design relazionale: gli indirizzi. Come dovrebbero essere normalizzati gli indirizzi postali? Quante tabelle dovrebbero essere suggerite? Secondo la mia comprensione di 3NF, hai bisogno di tabelle per paesi, stati / province e città. Non so se il codice postale / i guasti delle città abbiano senso, ma probabilmente lo fanno. Ma come si analizzano i dati esistenti e si determina (città, stato) -> paese? Come si determina se / se i codici postali non si collegano globalmente a questi costrutti?
Chris Travers,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.