Re: Restar y sumar valor de campo mysql
[email protected] (Carlos Medina)
| Newsgroups | php.general.es |
|---|---|
| Organization | SimplyNetworks |
| Message-ID | <[email protected]> |
Am 27.10.2011 00:04, schrieb Anto:
> hola
>
> tengo una duda sobre rendimiento en mysql, estoy haciendo una
> aplicacion que tiene movimientos de dinero, se inserta en un campo el
> usuario, otro la fecha y si es descuento (ej. -100) o si es ingreso
> (100), pero para no estar constantemente en cada inserccion, habia
> pensado crear otra tabla que almacene los totales, asi me evito hacer
> en cada consulta otra posterior que haga un sum para saber los
> totales. ¿Que es lo mejor para esto? Hacer un trigger que me sume o
> reste el valor introducido en el total o hacerlo mediante php y
> consultas (¿primero una lectura del total, almacenar el valor en una
> variable, sumarle o restarle el que se añade y hacer un insert????),
> es que desconozco si se puede hacer con una sola linea de sql, solo se
> me ocurre el trigger. muchas gracias
>
> saludos
Hola,
lo puedes hacer todo des de el SQL en una sola linea. Lo importante es
que tengas en cuenta dos cosas:
1.- Si los movimientos de saldo son importantes, has de usar
transacciones para evitar datos inconsistentes.
2.- Si los movimientos de saldo son muchos, has de usar una tabla nueva
donde almacenes los estados de cuenta.
Puedes hacer pues los movimientos de saldo como dijiste en una tabla con
los campos como
id (auto, PK);
usuario_cuenta (int, FK);
usuario_saldo (int);
usuario_date (datetime);
Con esto puedes saber, que dia y que hora se hizo la transaccion de
dinero en si.
Con la tabla estados de cuenta:
id (auto, PK);
estados_cuenta (int, FK);
estados_saldo (int)
estados_date (datetime)
Aqui puedes saber, que estados de cuenta tiene un cliente a determinada
valuta. Date cuenta que he puesto en vez de un usuario id, una *_cuenta
als FK, para referenciar los usuarios por numero de cuenta. Acuerdate
que si manejas valores de tipo int, las operaciones seran mas rapidas.
Ademas tienes que darle a las tablas el engine adecuado. Por ejempo si
vas a hacer muchas preguntas a la tabla (el caso de los estados de
cuenta) pues usas myisam que es mas rapida en la lectura. Para grabar
los movimientos de saldo pues usas InnoDB. Hay otras engines que puedes
usar como BDB.
Si esto aun no lo es todo y deseas o tienes que sacar mucha mas
informacion en menos tiempo, te recomiendo pues usar memcached. Aqui
tienes que tener mucho cuidado al usar esto pues es un store System que
te permite hacer cosas muy buenas pero tambien burradas costosas.
Si trabajas con Memcached pues sabras que solo puedes grabar valores
tipo KEY -> VALUE.
Es decir tienes que declarar tus namespaces por ti mismo. Por ejemplo asi:
ESTADO_DE_CUENTA.CLIENTE_NR1.DATE_MOVIMIENTO1.TIPO_VALOR1 = -100
ESTADO_DE_CUENTA.CLIENTE_NR1.DATE_MOVIMIENTO1.TIPO_VALOR1 = 10
En este sentido puedes acceder a los valores usando una recursion sobre
los keys puestos. Los Estados de cuenta los sacas asi:
ESTADO_DE_CUENTA = {CLIENTE_NR1, CLIENTE_NR2, CLIENTE_NR3}
Los Movimientos
CLIENTE_NR1 = {DATE_MOVIMIENTO1,DATE_MOVIMIENTO2,DATE_MOVIMIENTO3}
Asi hasta que lleges a los valores que deseas. Usando memcached pedes
hacer operaciones en milisegundos.
Espero te sirva.
Saludos
Carlos Medina