Sono stato educato alla vecchia scuola - dove abbiamo imparato a progettare lo schema del database PRIMA del livello aziendale dell'applicazione (o usando OOAD per tutto il resto). Sono stato abbastanza bravo a progettare schemi (IMHO :) e normalizzato solo per rimuovere la ridondanza non necessaria, ma non dove ha influito sulla velocità, ad esempio se i join sono stati un impatto sulle prestazioni, la ridondanza è rimasta al suo posto. Ma soprattutto non lo era.
Con l'avvento di alcuni framework ORM come ActiveRecord di Ruby o ActiveJDBC (e alcuni altri che non ricordo, ma sono sicuro che ce ne sono molti) sembra che preferiscano avere una chiave surrogata per ogni tabella anche se alcuni hanno chiavi primarie come 'e-mail' - rompendo completamente 2NF. Va bene, capisco non troppo, ma mi dà sui nervi (quasi) quando alcuni di questi ORM (o programmatori) non riconoscono 1-1 o 1-0 | 1 (cioè da 1 a 0 o 1). Stabiliscono che è semplicemente meglio avere tutto come un grande tavolo, non importa se ha un sacco di nulls
"i sistemi di oggi possono gestirlo" è il commento che ho sentito più spesso.
Concordo sul fatto che i vincoli di memoria presentavano una correlazione diretta con la normalizzazione (ci sono anche altri vantaggi :) ma ai giorni nostri con memoria a buon mercato e macchine quad-core il concetto di normalizzazione dei DB è appena lasciato ai testi? Come DBA pratichi ancora la normalizzazione su 3NF (se non su BCNF :)? Importa? Il design "schema sporco" è buono per i sistemi di produzione? Proprio come si dovrebbe rendere il caso "per" normalizzazione se è ancora rilevante.
( Nota: non sto parlando degli schemi stella / fiocco di neve di datawarehouse che hanno ridondanza come parte / necessità del design, ma sistemi commerciali con un database back-end come StackExchange per esempio)