Problemas con una aplicacion LAMP

Iniciado por patillotes, Noviembre 21, 2011, 03:11:19 PM

Tema anterior - Siguiente tema

patillotes

Explicacion.

Tenemos tres tablas implicadas:
- Una de entidad: empr, del cual nos interesan dos campos (id_empr = numero consecutivo que es la clave ppal y empr_cb = numero de expediente, que me identifica al alumno de manera mas normal)
- Otra de entidad: groupe, del cual me interesan dos campos (id_groupe = clave ppal, libelle_groupe = nombre humano del grupo, como 1ESOA, etc)
- Una de relacion (NxM): empr_groupe entre ambas, que nos indica la pertenencia del chaval al grupo. Nos interesan las claves externas y ligadas a las anteriores empr_id, groupe_id

Con esto me he construido un CSV con la relacion entre chaval y grupo y luego el siguiente script:

#!/usr/bin/perl

use strict;
use warnings;
use DBI;

# Opening and datafile
open my $FILE, '<', 'expediente-grupo.csv';

# Conecting to DB, (Beware: Hardcoded parameters, quick and dirty)
my $dbh = DBI->connect('DBI:mysql:lliurexpmb', '****', '****) or die "Couldn't connect to database: " . DBI->errstr;

while (<$FILE>){
chomp;
my ($expediente, $grupo) = split /:/, $_;

my $query = "INSERT INTO empr_groupe (empr_id, groupe_id) VALUES ((SELECT id_empr FROM empr WHERE empr_cb = $expediente), (SELECT id_groupe FROM groupe WHERE libelle_groupe = '$grupo'));";

# The real point, INSERTING INTO DB
my $result = $dbh->do($query);

# DBG (Only for paranoia), not uncomment if want to see error messages
#print $query, "\n";
}

close $FILE;
$dbh->disconnect();
<>;


Que abre una conexion contra la DB y actualiza la tabla de marras.

Mi duda como novato en DBs es si la operacion:

INSERT INTO empr_groupe (empr_id, groupe_id) VALUES ((SELECT id_empr FROM empr WHERE empr_cb = $expediente), (SELECT id_groupe FROM groupe WHERE libelle_groupe = '$grupo'));

Esta bien hecha. Quicir, funciona bien, pero tenia dudas de si los VALUES es mas mejor escribirlos a partir de un JOIN o queda mejor con dos subqueries como he hecho.

¿Como lo veis?

Y muchas gracias, Baku, por la ayuda. Que no te lo he dicho antes.

Baku

Las "subquerys" son, en general, poco recomendables por ineficientes.
It's very difficult todo esto.

patillotes

Ya me temia algo asi, ¿como seria la mejor manera de hacerlo?

Baku

No sé, ahí­ usas todo í­ndices y no hay más que un nivel de anidamiento, así­ que igual no merece la pena matarse mucho la cabeza.

Pero yo obtendrí­a todos los valores primero y los meterí­a en un array o un diccionario.

Y luego harí­a un único insert.

Al tener que leer los datos de un archivo y no de tablas no se me ocurre manera de evitar el bucle, por lo que no ahorras mucho,  pero si no fuera así­  con dos querys tení­as todo hecho.

Pero en todo caso un único insert con muchas filas deberí­a ser más rápido que un insert por fila.
It's very difficult todo esto.

patillotes

Aja, meter el bucle lo mas dentro posible va mas rapido.

¿Es eso?

patillotes

Quicir, si me construyese un INSERT INTO gigante en el script y se lo endiño entero, eso es mejor/mas_rapido, ¿no?

Baku

Cita de: patillotes en Noviembre 24, 2011, 08:44:13 PM
Aja, meter el bucle lo mas dentro posible va mas rapido.

¿Es eso?

En realidad yo decí­a sacar del bucle todas las querys que puedas, pero sí­, viene a ser lo mismo.
It's very difficult todo esto.

Baku

#22
Cita de: patillotes en Noviembre 24, 2011, 08:52:07 PM
Quicir, si me construyese un INSERT INTO gigante en el script y se lo endiño entero, eso es mejor/mas_rapido, ¿no?

Sí­. En Php es relativamente fácil y Perl, que tengo practicamente olvidado, sé que se maneja bastante bien y rápido para construir cadenas.
It's very difficult todo esto.

patillotes

Ok, como ejercicio me hare un script equivalente y probare.

Y el Perl es el hermano viejo de Php para estas cosas. Machacar texto es lo suyo.