Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-05-2006
reevil reevil is offline
Miembro
 
Registrado: abr 2006
Posts: 179
Poder: 19
reevil Va por buen camino
incluir totales o no

hola...
la pregunta es:
¿conviene o no incluir un campo para totales en una tabla de mysql?
la mayoria (yo incluido) no lo recomienda, pero me surgio la duda de que sera mas importante , espacio en disco o desempeño...
supongamos algo como esto:
un sistema que genera facturas o liquidaciones con 3 tablas:

tbliquidacion con campos tipo int: idliq*,totalproduccion,totalprestamos.

tbproduccion con campos tipo int: idliq, produccion.

tbprestamos con campos tipo int: idliq, prestamo.

asi a simple vista hay quien diria que los campos totales no son necesarios y que solo aumentarian el tamaño de la base de datos... pero que tan importante es eso cuando tenemos dispositivos de almacenamiento sobrados?... no seria mas conveniente sacrificar un poco de espacio para hacer algunas consultas mas rapidas??

saludos...
Responder Con Cita
  #2  
Antiguo 06-05-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Pero, ¿qué te hace pensar que las consultas serían más rápidas? En La biblia de MySQL que estoy leyendo (y que por cierto recomiendo a todos, pues leer, aunque sea traducido a Ian Gilfillan resulta muy ameno) se trata sobre el tema en el sentido de que los cálculos que puedan delegarse al gestor de bases de datos es mejor delegarlos, por varios motivos.

Mezclaré a continuación una serie de motivos, unos directamente sacados del libro que menciono y otros añadidos por mi cuenta y riesgo. Se me ocurre que añadir un campo a una tabla de la base de datos está demás, cuando ese campo puede calcularse de la suma (por ejemplo) de dos campos de dicha tabla u otra, supongo.

Según el libro el que nuestra aplicación no se ocupe de lo que pueda ocuparse el gestor de bases de datos la convierte en más portable; el delegar, como ya he dicho, al gestor de la base de datos ciertos cálculos, como en este caso, puede redundar en una mejora en el rendimiento de la aplicación (y ahí iba yo antes con lo de que no sabes si las consultas resultarían más rápidas y menos costosas,... hasta que no lo pruebes, digo yo, vamos).

En fin, no me hagas tampoco mucho caso, porque recién comienzo en MySQL, pero, yo entendí más o menos lo que he tratado de explicar. Pueden todos corregirme, tú incluído, si ves que es menester.

PD. Estoy seguro de que había más beneficios tratando de delegar (insisto) en el gestor de bases de datos las tareas de que puede ocuparse, y no llevarlas a cabo en nuestra aplicación, aun cuando fuera posible también llevar a cabo dichas tareas en ella.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 06-05-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
Según el libro el que nuestra aplicación no se ocupe de lo que pueda ocuparse el gestor de bases de datos la convierte en más portable
No entiendo muy bien esto. ¿Por qué la hace más portable?

// Saludos
Responder Con Cita
  #4  
Antiguo 06-05-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A ver, una cosa. Si el campo calculado se obtiene de otros campos de la misma tabla, ciertamente veo pocos beneficios en guardarlo. Pero en el ejemplo que se pone, el campo calculado es el producto de campos de distintas tablas. Se dice fácil multiplicar, pero para ello habrá que hacer dos joins:

Código SQL [-]
select tblproduccion.produccion* tblprestamo.prestamo
from tbliquidacion, tblproduccion, tblprestamo
where
  tblliquidacion.idliq = tblproduccion.idliq and
  tblliquidacion.idliq = tblprestamo.idliq

y un join siempre toma tiempo. A lo mejor el caso expuesto es muy simplista pero pienso que no podemos afirmar que se puede prescindir siempre de guardar el cálculo. Dependerá en mucho del objetivo, quizá si se requieren muchos listados o reportes, convenga guardarlo.

// Saludos
Responder Con Cita
  #5  
Antiguo 06-05-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. Sin duda, revisando por encima de nuevo el capítulo cinco del libro que mencioné arriba, he debido confundir algunos conceptos y términos y hasta dónde puede llegarse con la portabilidad, porque, no encuentro escrito, efectivamente, algo que confirme lo que he dicho. Sin embargo, tal vez me equivocase de capítulo... tal vez estuviera en otro... lo que me hizo decir lo que dije, o fueron varios capítulos los que me han llevado a decirlo.

En fin. Puedo aceptar que en este caso en concreto no se consiga un código "más portable", aunque mantengo que considero mejor (más lógico, modestamente) el calcular un "total" a partir de uno o más campos, que no guardar un "total" en un campo aparte. Al menos así, sin conocer del todo de qué estamos hablando realmente, como norma general.

Por otro lado, lo de que fuera también más portable lo que pudiera resultar de hacerlo de ese modo, puede que me saliera de haber leído este párrafo introductorio del capítulo cinco del libro susomentado:

Cita:
Empezado por Ian Gilfillan
Como lograr codigo portable y sencillo de mantener

Basta con aplicar unos sencillos pasos para mejorar enormemente la flexibilidad del codigo. Entre ellos, se incluye el mantenimiento de los detalles de conexion aparte y dentro de una unica ubicacion asi como la construccion de consultas de base de datos de manera flexible para que los cambios futuros que se apliquen a la estructura de la base de datos no afecten a la aplicacion.
Y hasta ahí puedo llegar... ignoro cuánto de portabilidad añadirá en este caso en concreto a nuestra aplicación el aprovechar el gestor de la base de datos para realizar los cálculos precisos para conseguir un "total", lo que me parece que podría ser es que no restaría portabilidad, y, bueno, en todo caso, que no estaría demás tampoco.

Disculpad que no sepa hablar del tema, que no utilize bien ciertos conceptos, palabras, etc., pero, sobre esto, como sobre tantas cosas, estoy más bien pez.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 06-05-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Román
A lo mejor el caso expuesto es muy simplista pero pienso que no podemos afirmar que se puede prescindir siempre de guardar el cálculo. Dependerá en mucho del objetivo, quizá si se requieren muchos listados o reportes, convenga guardarlo.
Por supuesto. Estoy de acuerdo. Pero, a lo mejor lo que sí se puede sacar en conclusión (aunque acaso ya me salga del tema completamente) es que mientras pueda utilizarse el gestor de bases de datos para realizar determinadas tareas, generalmente conviene que sea este quien se encarge de ellas y no nuestra aplicación.

Me permito citar otro párrafo del capítulo cinco del libro susomentado:

Cita:
Empezado por Ian Gilfillan
Cuanto trabajo deberia realizar el servidor de la base de datos?

Uno delos debates constantes entrelos desarrolladores es como deberia repartirse la carga de trabajo entre el servidor de la base de datos y la aplicacion.

En un primer momento,los desarrolladores de MySQL se mostraron muy a favor de delegar todo el peso en la aplicacion, en parte porque no incorporaba algunas funciones, como procedimientos almacenados y desencadenadores, y en parte por una cuestion de principios. Esta actitud les convirtio en objeto de criticas y la ausencia de estas funciones llevo a la gente a considerar a MySQL como una base de datos poco seria (una etiqueta de la que solo ahora, con la version 4, esta comenzando a superar).

En general, la base de datos deberia hacer todo el trabajo posible. (...)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 06-05-2006 a las 06:59:04.
Responder Con Cita
  #7  
Antiguo 06-05-2006
reevil reevil is offline
Miembro
 
Registrado: abr 2006
Posts: 179
Poder: 19
reevil Va por buen camino
hola de nuevo.
yo tambien he sido de la idea de preferentemente no utilizar campos para totales pero imaginemos esto:

liquidacion #1 esta formada por 5 producciones y 4 prestamos.

para saber el total de produccion neta de dicha liquidacion habria que hacer la suma de las 5 producciones y restarle la suma de los 4 prestamos...

y peor aun, si queremos la produccion neta desde la factura #1 hasta la #10,000 ... tendriamos que hacer la suma de todas las producciones donde idliquidacion este entre 1 y 10000 y a eso restarle la suma de todos los prestamos

si ponemos un campo totalneto, para cada liquidacion, solo seria un select que nos regrese la suma de los totales

supongo debe haber circunstancias donde se compliquen aun mas las cosas...

ahi es cuando me surge la duda si no conviene hacer trabajar practicamente nada al cliente al momento de insertar producciones y prestamos

saludos a todos
Responder Con Cita
  #8  
Antiguo 06-05-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Repito lo mismo. Hay que hacer un balance entre ser más papista que el papa y el rendimiento. En ocasiones, por ejemplo, conviene sacrificar normalización de la base en aras de rendimiento. Por otra parte esto no es tanto un problema de entre qué dejar a la aplicación y qué al motor de la base (*) sino de guardar o no un campo redundante.

(*) Y en cuanto a esto también hay muchas opiniones. El autor que mencionas tiene la suya pero también hay muchos que opinan en sentido contrario. Hasta donde entiendo, los procedimientos almacenados tienden a ser muy dependientes del motor y por ende, un uso excesivo de ellos hará el sistema poco portable a otros motores.

// Saludos
Responder Con Cita
  #9  
Antiguo 06-05-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Justamente reevil, ahora expones un caso mucho más realista. Los cálculos se complican y ante todo está el rendimiento, máxime que tales cálculos dependen ya no sólo de otras columnas sino de otros registros. No veo problema alguno en usar un campo extra.

// Saludos
Responder Con Cita
  #10  
Antiguo 06-05-2006
reevil reevil is offline
Miembro
 
Registrado: abr 2006
Posts: 179
Poder: 19
reevil Va por buen camino
Thumbs up

Cita:
Empezado por roman
Justamente reevil, ahora expones un caso mucho más realista...
cierto, creo que debi poner un ejemplo de cuando digo

Cita:
Empezado por reevil
no seria mas conveniente sacrificar un poco de espacio para hacer algunas consultas mas rapidas??
saludos a todos
Responder Con Cita
  #11  
Antiguo 06-05-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

A ver, a ver, aclaremos algunas cosas...

En primer lugar diré que, efectivamente, yo había pensado en un par de campos que hubieran de sumarse o multiplicarse o con los que realizar un cálculo, en fin, para obtener un total. Quizás no leí del todo bien el problema que planteaba el compañero y me lanzé a contestar, puesto que tengo bastante reciente lo leído en el libro de Ian Gilfillan.

Cita:
Empezado por Román
Repito lo mismo.
Ya somos dos, entonces.

Cita:
Empezado por Román
Hay que hacer un balance entre ser más papista que el papa y el rendimiento.
Nadie habló de ser más papista que el papa hasta ahora. Sí se habló de que en general podría tenderse a una cosa, pero, por supuesto (¿cómo dudarlo?) habrían de tenerse en cuenta las necesidades de aquello que tuviéramos entre manos.

Cita:
Empezado por Román
En ocasiones, por ejemplo, conviene sacrificar normalización de la base en aras de rendimiento.
Así he leído también en La biblia de MySQL, efectivamente. Aunque palabras como normalización (ni su sentido) están todavía muy lejanas de mi comprensión, lo cierto es que recuerdo haber leído que la normalización a veces (estamos otra vez en lo mismo: en el depende) tendría que supeditarse a otros objetivos.

Cita:
Empezado por Román
Por otra parte esto no es tanto un problema de entre qué dejar a la aplicación y qué al motor de la base (*) sino de guardar o no un campo redundante.
Pero tú ya estás pensando en la normalización. ¿O me equivoco? Yo no lo decía por tanto, esto es, no había tenido en cuenta eso, para qué nos vamos a engañar.

Cita:
Empezado por Román
Y en cuanto a esto también hay muchas opiniones. El autor que mencionas tiene la suya pero también hay muchos que opinan en sentido contrario.
¡Pues no faltaría más! Sin embargo, de lo poco que he leído a Ian Gilfillan (y traducido al español, y no pierde aún así, en mi opinión, cierto buen rollo que transmiten sus palabras) me parece un tipo bastante razonable y lo que propone bastante lógico, siempre en cuanto a mí me pueda parecer lógico un tema que me supera no poco.

Cita:
Empezado por Román
Hasta donde entiendo, los procedimientos almacenados tienden a ser muy dependientes del motor y por ende, un uso excesivo de ellos hará el sistema poco portable a otros motores.
Aquí estamos como con la normalización. Simplemente, yo no había pensado en procedimientos almacenados, ni las consecuencias de su uso indiscriminado.

En fin. ¿Quién me manda a mí meterme en estos berenjenales?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #12  
Antiguo 06-05-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
Simplemente, yo no había pensado en procedimientos almacenados
Tú no pero el autor que citas sí y lo hace en la cita que de él citas

// Saludos
Responder Con Cita
  #13  
Antiguo 06-05-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Román
Tú no pero el autor que citas sí y lo hace en la cita que de él citas
Lo sé, lo sé, pero, no tiene nada que ver... el autor está desarrollando una idea (pensando en ella), el párrafo además está fuera de contexto; tú has pensado en ello porque sin duda vas más allá que yo; y yo, simplemente, no pensé en ello, porque no creí que fuera necesario para lo que nos ocupa, mejor dicho para lo que imaginé que podría estar ocupándonos, porque nunca pensé en más de dos campos "a calcular".
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 06-05-2006 a las 07:45:13.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Totales por Grupo trex2000 Impresión 2 24-08-2005 18:40:14
Totales en informe Asshole Impresión 1 16-06-2005 15:33:05
Totales con FreeReports brandolin Impresión 0 28-08-2004 07:13:37
Problemas con Totales pruz Impresión 3 26-07-2004 21:08:48
Calculo De Totales PETERKANTROPUS Tablas planas 2 25-05-2004 03:06:14


La franja horaria es GMT +2. Ahora son las 19:11:03.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi