2011-09-08 40 views
9

Estoy escribiendo un programa usando Ruby on Rails y PostgreSQL. El sistema genera muchos informes que los usuarios actualizan con frecuencia y acceden con frecuencia. Me siento dividido entre si debo usar los desencadenadores de Postgres para crear las tablas de informes (como las vistas materializadas de Oracle) o los Rails incorporados en las devoluciones de llamada de ActiveRecord. Alguien tiene pensamientos o experiencias sobre esto?Ventajas y desventajas de los desencadenadores de base de datos frente a devoluciones de llamada de Active Record de Rails?

Respuesta

12

devolución de llamada son útiles en los casos siguientes:

  • combinar todos lógica de negocio en los modelos de raíles que la facilidad de mantenimiento. uso
  • Hacer de los carriles existentes código del modelo
  • fácil de depurar
  • código Ruby es más fácil que escribir/leer que SQL "de mantenimiento"

desencadenantes son útiles en los siguientes casos:

  • El rendimiento es una gran preocupación. Es más rápido que las devoluciones de llamada.

Si su preocupación es fácil y limpia, utilice devoluciones de llamada. Si su preocupación es el rendimiento, entonces use desencadenantes.

+0

¿Cuál es la razón para el aumento de rendimiento al utilizar disparadores? – Zubair

+1

Porque en la devolución de llamada, se conectará a DB, sin embargo, en los desencadenadores no necesitará conectarse a db ya está en la capa de DB –

+0

Ah tiene sentido.Gracias – Zubair

5

Tuvimos el mismo problema, y ​​dado que este es un tema interesante, lo elaboraremos según nuestra elección/experiencia.

Creo que el concepto es más complejo que lo que se destaca en la respuesta actual.

Como estamos hablando de informes, supongo que el caso de uso es la actualización de las tablas de almacenamiento de datos, no una aplicación "genérica" ​​(esta suposición/distinción es crucial).

En primer lugar, la idea de "fácil de depurar" no es [necesariamente] verdadera. En nuestro caso, es contraproducente pensarlo.

En aplicaciones suficientemente complejas, algunos tipos de devoluciones de llamadas (actualizaciones de almacenamiento de datos/millones de líneas de código/equipo de tamaño medio o más) son simplemente imposibles de mantener, porque hay tantos lugares/formas en que la base de datos será actualizado, que será prácticamente imposible depurar las devoluciones de llamadas perdidas.

Los disparadores no tienen que diseñarse necesariamente como la lógica "compleja y rápida". Específicamente, los desencadenadores también pueden funcionar como lógica de devolución de llamada de bajo nivel, por lo tanto, son simples y delgados: simplemente reenviarían los eventos de actualización al código de raíles.

Para concluir, en el caso de uso mencionado, las devoluciones de llamadas de los rieles deben evitarse como la peste.

Un diseño eficiente y eficaz es tener desencadenantes RDBMS agregando registros a una tabla de cola, y un sistema de cola de rieles, que actúa sobre ellos.

(Desde este post es viejo, yo soy curioso sobre lo que ha sido la experiencia de la OP)

Cuestiones relacionadas