FAQ
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

Search Discussions

  • Ricardo Martinez at Oct 27, 2011 at 1:27 am
    Hola!!!

    desde mi punto de vista hay dos caminos marcados;

    hay personas que prefieren usar más la base de datos. Mayor seguridad en la
    integridad de los datos etc.

    Otras preferimos hacerlo desde programación (PHP). Mayor velocidad.

    Desde mi punto de vista se gana más velocidad, implementando todo lo que sea
    posible desde programación, pero cuidado, también suele ser más laborioso, y
    da pie a más errores.
    Ya que hay que controlar más variables, y exigue mayor planificación.

    Un saludo!!!


    2011/10/27 Anto <potxoka@gmail.com>
    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

    --
    PHP Spanish Localization Talk Mailing List (http://www.php.net/)
    To unsubscribe, visit: http://www.php.net/unsub.php

    --
    Ricardo
    _______________________________________________
    IT Architect
    website: http://www.pulsarinara.com
  • Carlos Medina at Oct 27, 2011 at 6:27 am

    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
  • Anto at Nov 5, 2011 at 9:28 pm
    hola

    Muchas gracias a ambos por responder. Si, tenia mas claro el tema de
    las tablas y demas; lo que no tan claro es lo del la tabla que tiene
    el contador. Quizas me explique mejor con un ejemplo:

    La tabla con las transacciones tiene diarias por usuario por ejemplo
    500 insercciones. Entonces si por ejemplo quiero mostrar el total,
    cada vez que se solicite, hago un sumatorio de todos los movimientos
    por ese usuario, seria muy pesado (hay mas usuarios y cada vez que se
    quiera consultar), entonces por eso habia pensado otra tabla que por
    cada registro sume o reste del total. Pero claro, no tengo tan claro
    si en una sql puedo sumar o restar segun su valor. Entonces se me
    ocurria hacer primero un select, almacenar en una variable el valor
    del campo total y operar (sumar o restar) segun la variable y hacer el
    insert, pero claro, son dos consultas, aparte de la tabla de
    movimientos (que seria una tercera).

    Esta es mi duda, si podria hacer mediante una sentencia algo que sume
    o reste segun el valor insertado en la otra. Es que desconozco si hay
    algun "modificador" o "parametro" que le diga, haz un update sumando o
    restando al valor actual. Habia pensado usar un trigger porque asi
    tampoco dependo de la programacion, pero tambien mirando seria tambien
    como dos query (bajo mis conocimientos). Ufff, tengo super olvidado
    mysql. Haber si alguien me puede decir si existe algo para hacerlo en
    una query y ya busco como seria jeje. Gracias a tdos.

    saludos

    El día 27 de octubre de 2011 08:27, Carlos Medina
    <info@simply-networks.de> escribió:
    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

    --
    PHP Spanish Localization Talk Mailing List (http://www.php.net/)
    To unsubscribe, visit: http://www.php.net/unsub.php

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupphp-general-es @
categoriesphp
postedOct 26, '11 at 10:04p
activeNov 5, '11 at 9:28p
posts4
users3
websitephp.net

People

Translate

site design / logo © 2022 Grokbase