Il tuo secondo esempio è effettivamente denormalizzato e le tabelle originali sono ridondanti, ma questo non è l'unico modo per denormalizzare i dati e mi azzarderei a dire che casi come questo sono rari. La denormalizzazione è un'ottimizzazione delle prestazioni, il che significa che lo fai perché hai problemi di prestazioni. Questi problemi sono diversi da caso a caso, quindi anche i modi per risolverli sono diversi.
Ricorda che la denormalizzazione ha un costo. Aggiornare il nome di una scuola è banale nel tuo primo esempio, ma costoso nel secondo.
Non penso che ci sia molto da guadagnare mettendo la colonna school_name
in School_has_Student
- quanto spesso cerchi il nome di una scuola, dato uno studente, alla rinfusa? Che tipo di volume raggiungerà ragionevolmente quel tipo di query? Il contrario (cercare i nomi di tutti gli studenti di una scuola) è più probabile che sia tassativo, quindi mantenere student_name
potrebbe avere senso. Ora Student
è ridondante, ma School
non lo è.
Un altro esempio di denormalizzazione dello stesso database originale consiste nell'aggiungere una colonna number_of_students
alla tabella School
. Questo ottimizza per un tipo specifico di domande ("Quanti studenti ha questa scuola?", "Quale scuola ha il maggior numero di studenti?", Ecc.) Rimuovendo la necessità di guardare più righe nella tabella School_has_Student
, ma tutte le tabelle sono ancora necessarie per le altre query.
Se anche gli studenti avevano un genere, dovresti mantenere la tabella Student
poiché quelli non sono inclusi nella tabella School_has_Student
. Puoi anche mantenere il rapporto di genere nella tabella School
(un'altra denormalizzazione) e ora non hai tabelle ridondanti.
Puoi rimuovere tabelle ridondanti, ma non è probabile che tu le abbia.