Pregunta

A menudo trato con entidades agregadas o matrices que tienen atributos derivados de sus miembros constituyentes o secundarios.Por ejemplo:

  • El byte_count y packet_count de un TcpConnection El objeto se calcula a partir de los mismos atributos de sus dos componentes TcpStream objetos, que a su vez son calculados a partir de su constituyente TcpPacket objetos.

  • Un Invoices objeto podría tener un total que es básicamente la suma () de su constituyente InvoiceLineItems'Precios, con un poco de carga, descuento y lógica fiscal.

Cuando se trata de millones de paquetes o millones de partidas facturadas (¡ojalá!), el cálculo bajo demanda de estos atributos derivados, ya sea en una VISTA o más comúnmente en la lógica de presentación como informes o interfaces web, a menudo es inaceptablemente lento.

¿Cómo decide, antes de que las preocupaciones sobre el rendimiento le obliguen, a "promover" atributos derivados a campos precalculados?

¿Fue útil?

Solución

Personalmente, no desnormalizaría hasta que las compensaciones de rendimiento me obliguen (porque las desventajas de las desnormalizaciones son demasiado drásticas en mi humilde opinión), pero también podrías considerar:

  1. Conveniencia:p.ej.Si dos aplicaciones cliente diferentes quieren calcular los mismos atributos derivados, ambas deben codificar las consultas para calcularlos.La desnormalización ofrece a ambas aplicaciones cliente el atributo derivado de una manera más sencilla.
  2. Estabilidad en el tiempo:p.ej.Si la fórmula para calcular un atributo derivado se puede cambiar, la desnormalización le permite capturar y almacenar el valor derivado en un momento determinado para que los cálculos futuros nunca se equivoquen.
  3. Consultas más simples:Agregar complejidad a la estructura de la base de datos puede significar que su consulta de selección sea más simple en el extremo del cliente.
  4. Actuación:Las consultas seleccionadas sobre datos desnormalizados pueden ser más rápidas.

Árbitro: El programador de bases de datos:El argumento a favor de la desnormalización.No dejes de leer también su artículo sobre Mantener correctos los valores desnormalizados - Su recomendación es utilizar disparadores.Esto nos recuerda el tipo de compensación que requiere la desnormalización.

Otros consejos

Básicamente, no lo hace. Usted dejó preocupaciones desempeño de la fuerza de su mano.

Esa es la mejor respuesta porque el 99% de las veces, usted debe no ser pre-optimizando de esta manera, es mejor simplemente calc sobre la marcha.

Sin embargo, es bastante común que los desarrolladores de aplicaciones cliente-vengan al lado del servidor con ideas preconcebidas erróneas como " cómputo bajo demanda de ... atributos derivados ... - es frecuencia inaceptablemente lento ", y esto simplemente no es verdad. La redacción correcta en este caso sería " raramente inaceptablemente lento ".

Como tal, a menos que seas un experto en este (un arquitecto de Desarrollo DB, etc.), no debe estar involucrado en la optimización prematura. Espere hasta que sea obvia que es tiene que ser fijo, después mirar pre-agregación.

¿Qué tan actualizada los datos deben ser determina la forma de ponerla en práctica, de verdad.

Vamos a suponer 2 estados simples: corriente o no corriente

.
  • actuales: indexada vistas, disparadores almacenados procs para mantener tablas agregadas, etc.
  • No al día: Informes instantáneas de servicios, el trasvase de registros / replicación, almacenamiento de datos, etc.

Una vez dicho esto, iba a desarrollar en contra de la misma cantidad de datos que tengo en prod así que tengo algo de confianza en el tiempo de respuesta. Rara vez debe ser sorprendido por el rendimiento de su código ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top