entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Vista, procedimiento o function de codeigniter en MySQL

Hola Comunidad, tengo una situación que estoy implementando desde codeigniter pero quisiera conocer si es posible implementarla completamente en una vista o procedimiento o function en MySQL y ejecutarla haciendo la llamada, ya que todo se hace en la base de datos:

public function _down($nombre_seccion){
        /*  Da de Baja una Seccion y todo su contenido.
         *  Esta pasa sus datos de seccion asi como sus estadisticas de activas a pasivas. 
         *  Su Cache se mantiene hasta hacer el recargue de Cache Manualmente por el usuario en el DashBoard. 
         *  --Nota: No se elimina el icono por si algún día vuelve a ser alta
         #1 Crear la columna de Estadística en la tabla de estadisticas pasivas
         #2 Copiar los datos de la Estadistica activa para la estadistica pasiva
         #3 Eliminar la columna de estadistica activa
         #4 Pasar los datos de seccion activa para seccion pasiva
         #5 Eliminar los datos de la seccion activa
         #
         */
        #Agregar Columna a estadisticas
        $this->load->dbforge();
        $seccion = $this->get_seccionAct_byName($nombre_seccion);              
        $this->dbforge->add_column('estadisticas_pasivas', array('E'.$seccion->id => array('type' => 'INT','unsigned' => TRUE,'default' => 0))); 
    }

Nota: sobre la estructura de mi base de datos. tengo las tablas estadisticas_pasivas y estadisticas_activas donde solamente tengo el campo fecha y dinamicamente cuando se inserta una sección de noticias yo agrego una columna con el nombre E+id_seccion este campo comienza con valor 0 y se incrementará cada vez que se inserte una noticia y se decrementará en caso contrario. Cuando una sección se desactiva entonces esta columna tengo que pasarla con todos sus valores para las estadísticas pasivas.
Tengo un tabla donde tengo las secciones activas y otra con las secciones pasivas sus campos son iguales con el detalle que el id de secciones activas es de auto incremento y el de pasiva no. una vez que una seccion cause baja tengo que pasar los datos de activa para pasiva.
Alguien podría decirme si es posible dejarle todo este trabajo solamente a la Base de Datos y yo llamarlo con una sencilla función desde mi sitio ??
Hace años cuando trabajé con PostgreSQL existía los procedimientos pero ahora trabajo con MySQL.
Saludos Dairon.

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Hola Dairón,

si estás familiarizado con StoreProcedures en PostgreSQL, MySQL también los soporta:

http://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html
http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html
http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx

Lo único que tenés que tener en cuenta es que las tablas deben estar en formato InnoDB en vez de en el viejo MyISAM.

Saludos cordiales!

0voto

dairon comentado

Maestro usted se refiere a todas las tablas de mi Base de Datos ?? que diferencias tengo entre InnoDB y MyISAM

0voto

Leonardo-Tadei comentado

No necesarimante a todas las tablas, pero sí a las que participen del Procedimiento Almacenado.

La diferencia entre MyISAM e InnoDB es que, además de guardarse en el disco de forma diferente, InnoDB soporta Procedimientos Almacenados, Triggers y Claves Foraneas, es decir, tenés las mismas funcinalidades que en PostgreSQL.

PD: estoy de acuerdo con @carlossevi sobre la cuestión de que no debería ser necesario cambiar la estructura si los datos están bien Normalizados. No afectaría para nada agregar una columna más con el ID de sección, ya que los INSERT no tardarán más, y para mantener chicas las tablas, podrías por ejemplo todos los meses borrar los datos de 2 meses atrás.

0voto

dairon comentado

Maestro @Leonardo-Tadei ya eliminé de mi código todo lo referente al trabajo con las tablas estadísticas activas y pasivas así como eliminé las mismas de la base de datos.
Crearé procedimientos y vistas que haciendo consultas me devuelvan los datos estadísticos que guardaba en estas tablas ;). Cuando comencé ha diseñar la estructura de la Base de Datos yo lo tenía de esta manera pero como me limitaban el tiempo de vida de una query a la database cree estas tablas que eran un dolor de cabeza por su ambiguedad.
Saludos y Gracias por la información que es bastantante útil ya que crearé varias vistas y procedimientos.

2votos

carlossevi Puntos63580

Si quieres dejarle el trabajo a MySQL puedes hacerlo mediante procedimientos almacenados o mediante triggers.

El procedimiento almacenado es una función almacenada en MySQL que se ejecuta mediante una consulta a la BBDD a la que se le pueden pasar parámetros. Ejemplo (suponiendo que antes la creaste): CALL baja_seccion('5');.

El trigger es código SQL que se ejecuta desencadenado por una acción sobre la base de datos. Los desencadenadores posibles son: antes o después de inserciones, actualizaciones o eliminaciones.

Ambas funciones de MySQL son en muchas ocasiones limitadas por los proveedores de hosting así que cuidado con utilizarlas.

Una vez dicho esto: yo no haría lo que comentas (si es que te he entendido bien). Mi impresión es que una base de datos que necesita que se inserten y/o eliminen columnas dinámicamente es una base de datos mal normalizada. Antes de implementar eso le daría una vuelta a la estructura.

0voto

dairon comentado

@carlossevi entiendo lo que mencionas, si que es mal normalizada pero yo tengo que sacar estadísticas de las secciones cada cierto tiempo y mi hosting solo me da un corto periodo de tiempo para las consultas pero los admin del hosting me han comentado que están aumentando el tiempo de conexion a las consultas por lo que puede ser que mi estructura cambie también

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta