Me imagino que desnormalizar demasiado desperdiciaría espacio y tiempo
El espacio no es motivo de preocupación en la mayoría de las aplicaciones OLTP de línea de negocio de tamaño mediano. Así que deja el espacio a un lado. Tiempo, y por tiempo supongo que se refiere al rendimiento de la consulta, eso es algo que generalmente se puede mejorar y no causa un problema real a menos que tenga un mal diseño, recursos insuficientes, una base de datos extremadamente grande, una gran cantidad de transacciones o todas lo anterior. La mayoría de las aplicaciones que utilizan las bases de datos actuales rara vez tendrían un problema de rendimiento solo porque la base de datos está Normalizada.
los blobs gigantes se duplican o porque es más difícil mantener la coherencia porque tienes que actualizar varios campos usando una transacción.
La normalización de su base de datos le asegura que su diseño:
No tener datos redundantes.
No causa que se cree una gran cantidad de enteritis de registro (por ejemplo, con una tabla de 2 millones de clientes: ACTUALIZAR el conjunto de clientes Country = "USA" WHERE Country = "US")
Ser totalmente compatible con consultas SQL. Este punto es muy importante.
Conducirá código de aplicación limpio.
Fuerce un alto grado de consistencia de datos a través de la base de datos sin sobrecargar la aplicación.
Comparta las reglas de negocio definidas en la base de datos por diferentes aplicaciones sin codificar el mismo código en diferentes aplicaciones.
Dicho esto, la Normalización produce una estructura óptima para todas las columnas y tablas. Es posible que esto no siempre lo necesite en su aplicación en particular, luego podría determinar, dada su comprensión de su dominio y su aplicación, desnormalizar algunas de las tablas / columnas como una compensación por la velocidad. Sin embargo, esa sería una decisión consciente más que un descuido.
Dado un conjunto de FD de 3NF y un conjunto de consultas, ¿cómo puedo predecir la aceleración / desaceleración de la desnormalización?
No puede predecir el rendimiento con precisión sin realizar pruebas (lo que puede hacer antes de escribir el código de la aplicación). Sin embargo, puede eliminar y detectar factores que conducirían a un mal rendimiento por diseño. Por ejemplo, puede identificar qué estrategia de índice usar de la siguiente manera (pueden existir otras técnicas):
Cree una matriz de consultas y columnas afectadas por esas consultas.
Encuentra las columnas que más se usan.
Considere construir índices en esas columnas.
Este es principalmente un trabajo en el que su DBA podría ayudarlo. Hay más en el rendimiento que la normalización. Hay aspectos de la distribución de datos sobre volúmenes de disco, división vertical de tablas, particionamiento, tipos de índice y almacenamiento en búfer de índice, por nombrar algunos. Todas estas técnicas deben abordarse en los libros y la documentación del proveedor en los temas "Diseño de la base de datos" y "Ajuste del rendimiento de la base de datos". Toda la discusión anterior supone que su aplicación es una aplicación OLTP.