Hay varias razones Carlos, opino que la principal es que forzás una dependencia entre atributos que no son PK , no cumple las formas normales, esto conlleva a posibles errores de consistencia ante modificaciones, también está el problema de espacio ocupado e innecesario, redundancia digamos. En todo caso, lo recomendable es: si hay redundancia, que sea "redundancia controlada" por ejemplo a través de triggers.
Saludos ~~~~~~~~~~~~~~~~ Guillermo Villanueva El 28 de octubre de 2010 04:23, Carlos Joaniquet <cjtam...@yahoo.es>escribió: > Por qué razón no se deben utilizar los campos calculados? > Es que en alguna de mis tablas existen varios :) que me recalculan gastos, > base imponible, iva, etc de un registro factura cada vez que introduzco un > apunte contable que hace referencia a esa factura. > ¿Es un mal diseño? > > Gracias > > Carlos Joaniquet Tamburini > > El 26/10/2010, a las 14:52, Virginia <mavi...@gmail.com> escribió: > > > > El 25 de octubre de 2010 23:09, Jaime Casanova < <ja...@2ndquadrant.com> > ja...@2ndquadrant.com> escribió: > >> 2010/10/25 Virginia < <mavi...@gmail.com>mavi...@gmail.com>: >> > Buenas noches, cómo están? quisiera saber si pueden ayudarme con una >> duda. >> > Tengo una tabla con los campos id, campo1, campo2, campo3, total y un >> > trigger q lo que debería hacer es que cada vez q inserto un registro en >> esa >> > tabla me sume el campo1 + campo2 + campo3 y actualice ese resultado en >> el >> > campo total. >> > Ahora bien, hice el trigger q se dispara desde la misma tabla me crea un >> > lazo infinito, cóm puedo resolver esto? o no debo hacer un n trigger q >> se >> > dispare cuando hay un evento en la tabla X para realizar una acción en >> la >> > misma tabla X? >> > >> >> apoyo la idea de la vista (los campos calculados no deberian existir a >> menos que haya una buena razon). >> >> sobre tu problema, no ejecutes otro insert ni un update, por eso se >> dispara el trigger deberias tener un codigo algo asi: >> >> create function fn_trg_calcula() returns trigger as $$ >> begin >> new.total = new.campo1+new.campo2+new.campo3; >> end; >> $$ language plpgsql; >> >> -- >> Jaime Casanova <http://www.2ndQuadrant.com>www.2ndQuadrant.com >> Professional PostgreSQL: Soporte y capacitación de PostgreSQL >> > > > > > Les comento, el código del trigger es el siguiente: > > CREATE OR REPLACE FUNCTION calcular_total() RETURNS trigger AS ' > BEGIN > IF (tg_op = ''INSERT'') OR (tg_op = ''UPDATE'') THEN > UPDATE promedios SET total= NEW.campo1 + NEW.campo2 + NEW.campo3 WHERE > id = codigo; > END IF; > RETURN NEW; > END > ' LANGUAGE plpgsql; > > > CREATE TRIGGER calcular_total AFTER INSERT OR UPDATE ON promedios > EXECUTE PROCEDURE calcular_total(); > >