Foros del Web » Programando para Internet » PHP »

actualizar relaciones n..m de manera optima

Estas en el tema de actualizar relaciones n..m de manera optima en el foro de PHP en Foros del Web. Hola, me surgio una consulta de la cual no encontre nada en el foro. Supongamos que tengo 3 tablas. Una tabla de usuarios, otra tabla ...
  #1 (permalink)  
Antiguo 25/04/2005, 08:26
 
Fecha de Ingreso: enero-2004
Ubicación: Argentina, Buenos Aires, Mar del Plata
Mensajes: 38
Antigüedad: 20 años, 3 meses
Puntos: 0
Pregunta actualizar relaciones n..m de manera optima

Hola, me surgio una consulta de la cual no encontre nada en el foro.
Supongamos que tengo 3 tablas. Una tabla de usuarios, otra tabla de equipos de futbol y otra tabla que es la relacion n a m de las 2, algo asi como usuarios_has_equipos. Bueno, en esta ultima tabla se guardan los idUsuario e idEquipo, guardando asi los equipos del cual el usuario es fanatico.
Cuando inserto los registros no hay problema, mi problema es el siguiente: llevo al usuario a una pagina donde le dejo modificar los datos, los mismos los muestro en un form para que el pueda cambiarlos. La tabla de equipos la muestro con un select multiple y ya marco los que tiene seleccionados desde que hizo el registro. Bueno, aca mi duda... cuando el usuario actualiza los datos, la unica forma de actualizar los datos correspondientes a los equipos del cual es fanatico que se me ocurre es:
- primero, borrar todos los que registros que tiene en la tabla usuarios_has_equipos.
- segundo, recorrer toda la lista de equipos e ir haciendo un insert en la tabla por cada uno que halla seleccionado.

En otras palabras, en vez de actualizar, hago eliminacion y despues insercion. La verdad no me gusta mucho, mas que nada porque me obliga a recorrer toda la lista de equipos.

Alguna sugerencia ?

Saludos, FERNANDO.
  #2 (permalink)  
Antiguo 25/04/2005, 09:12
Avatar de SAGITARIO  
Fecha de Ingreso: febrero-2005
Ubicación: Huancayo
Mensajes: 108
Antigüedad: 19 años, 2 meses
Puntos: 0
Sugerencia

Bueno amigo creo está bastante claro tu pregunta.

Te sugiero que cuando vas a Enviar los resultados de la lista multiple, debes usar
Código PHP:
<?
foreach($equip as $nombre)
?>
El array $nombre tendria los IDEQUIPO de la tabla equipos, bueno en este caso deberías cargar tu lista de la siguiente manera:
Código PHP:
//codigos de cabecera ...  conexion y select BD
$query="select * from equipos order by nomequipo>";
$rs=mysql_query($query);
echo 
"<SELECT NAME='equip[]' MULTIPLE>";
while(
$campo=mysql_fetch_array($rs))
{
echo 
"<OPTION VALUE=$campo['idequipo']>$campo['nomequipo']</OPTION>";
}
echo 
"</SELECT>"
Teniendo esa estructura en tu Lista puedes manejar el IDEQUIPO directamente desde el ARRAY sin necesidad de ir a la TABLA.


Respecto a la tabla INTERMEDIA pienso que podrias crear un campo CHAR(1) que te indique lo que paso ... me explico
puedes darle valores como por ejemplo:

C --> activo
E --> eliminado , etc.. asi tienes un historico en tu data.
Para que puedas ver los resultados de $nombre
pon este codigo en la pagina sucesiva cuando envias los datos seleccionados.

Código PHP:
<?
foreach($equip as $nombre)
{
echo 
$nombre."<BR>";
}
?>
Bueno espero en algo aliviar tu duda.
Salu2
  #3 (permalink)  
Antiguo 25/04/2005, 09:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Partiendo de la base que ya tienes claro como hacer las operaciones básicas con tus Base de datos (y tablas) a nivel de "ejecutar tu SQL" desde PHP .. El tema sobre como "optimizar" o mejor procedimiento para tal fin .. será cosa de que lo veas en el foro de "Base de datos"

Un saludo,
  #4 (permalink)  
Antiguo 25/04/2005, 14:35
 
Fecha de Ingreso: enero-2004
Ubicación: Argentina, Buenos Aires, Mar del Plata
Mensajes: 38
Antigüedad: 20 años, 3 meses
Puntos: 0
mmm, creo que no me entendieron. El tema base de datos ya lo tengo cerrado, las tablas estan hechas, las relaciones estan bien hechas. El select multiple lo genero dinamicamente de 10. Cuando le hago submit al form, el array que mando por $_post con todos los id de los equipos que selecciono en el select multiple llega de 10 tambien.
El problema es el siguiente: a la hora de procesar ese $_POST["idEquipos"] para actualizar la tabla usuarios_has_equipos, la unica que se me ocurre es borrar todos los registros en la tabla usuarios_has_equipos y recorrer todas la lista de equipos y ir chequeando uno por uno si es igual a un valor del array $_POST["idEquipos"] y cuando sea igual... insertar el registro con ese id.
Pero esto no creo que sea optimo, es decir, tengo que recorrer el listado de equipos enteros si o si ??
  #5 (permalink)  
Antiguo 25/04/2005, 15:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Bueno .. por eso te decía que bajo SQL y una sentencia SQL más acertada (subconsultas? .. IN()? .. etc) podrías hacer ese tipo de cosas .. sin tener que recorrer ninguna tabla con ningún bucle (tal vez .. estoy especulando pero no obstante si hablas de "querer optimizar" es una opción que tendrías que evaluar también).

Un saludo,
  #6 (permalink)  
Antiguo 25/04/2005, 15:47
Avatar de SAGITARIO  
Fecha de Ingreso: febrero-2005
Ubicación: Huancayo
Mensajes: 108
Antigüedad: 19 años, 2 meses
Puntos: 0
Hummmmmm

Bueno amigo no es necesario recorrer la tabla equipos , por que
este codigo :
Código PHP:
<? 
foreach($equip as $nombre

echo 
$nombre."<BR>"

?>
Soluciona tu problema. Por que ?

$nombre contiene los IDEQUIPOS que seleccionaste!, todo en array y no necesitas comparar ni recorrer la TABLA equipos ya que en la TABLA usuarios_has_equipos solo guardaras datos del IDEQUIPOS.

Espero que te ayude o es que no explico bien.

Salu2.

En todo caso podrias poner parte de codigo fuente y ver como ? lo estas trabajando, bueno si deseas.

Salu2.
  #7 (permalink)  
Antiguo 25/04/2005, 23:27
 
Fecha de Ingreso: enero-2004
Ubicación: Argentina, Buenos Aires, Mar del Plata
Mensajes: 38
Antigüedad: 20 años, 3 meses
Puntos: 0
sisi, hasta ahi todo perfecto amigos, pero me parece que no termino de explicarme bien...
Cuando inserto los datos esta todo bien, porque hago lo que vos decis, eso ya lo estaba haciendo asi:

Código PHP:
// Recibo del submit los datos ...
// Agrego los equipos al usuario
foreach ($_POST["equipos"] as $idEquipo) {
    
$sistema->usuarios->agregarEquipo($idUsuario,$idEquipo);
// Fin del FOREACH 

mi duda es a la hora de hacer una actualizacion, no una insercion... porque si el usuario me saca del select multiple los equipos que habia elegido previamente y cambia por otros, la unica forma que veo de hacer el update es la siguiente (eliminando todos los registros que tenia y insertando todos los que vienen):


Código PHP:
// Recibo del submit los datos ...
// Elimino todos los registros de este usuario en la tabla usuarios_has_equipos
$sistema->usuarios->eliminarEquiposDeUsuario($idUsuario);
// Agrego los equipos al usuario
foreach ($_POST["equipos"] as $idEquipo) {
    
$sistema->usuarios->agregarEquipo($idUsuario,$idEquipo);
// Fin del FOREACH 
Bueno, asi estoy casi seguro que anda... pero hay alguna forma de hacer esto sin eliminar los que ya tenia... porque en caso de que el usuario no cambie los equipos que ya tenia, sino que agregue otros a los que ya tenia, estaria borrando registros que iria a insertar nuevamente... se entiende ?
Entonces, lo que estoy haciendo se hace asi o hay alguna forma de optimizarlo ?

Saludos Amigos
  #8 (permalink)  
Antiguo 26/04/2005, 07:32
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
pero hay alguna forma de hacer esto sin eliminar los que ya tenia...
Realmente tendrías que probarlo .. Pero a mi parecer borrar esos registros y hacer un INSERT "a pelo" (sin más condicionales) creo que será más optimo (habría que probarlo insisto) que hacer en tu caso un SELECT para obtener los ID de los registros que ya tienes .. registrados en tu BD .. compararlos con los que quedaron al cambiar sus estados (los que han de quedar) y así obtener los que tienes que borrar .. no tocando los que son iguales (los que deben permanecer).

Insito .. lo mejor es que lo pruebes. Usa microtime() para ver el tiempo de ejecución de tu script .. y ahí decides (y nos pasas los datos de tus pruebas).

Un saludo,
  #9 (permalink)  
Antiguo 27/04/2005, 01:00
 
Fecha de Ingreso: enero-2004
Ubicación: Argentina, Buenos Aires, Mar del Plata
Mensajes: 38
Antigüedad: 20 años, 3 meses
Puntos: 0
Bueno, probe el tiempo que tarda en actualizar los datos con la funcion microtime() y por ahora es minimo... 0.061779. Asi que creo que como lo estoy haciendo esta bien, es decir, se que no esta mal... pero me quedara la duda si es lo optimo

Igual, gracias a todos por colaborar y no duden en aportar alguna idea si es que la tienen.

Saludos, FER.
  #10 (permalink)  
Antiguo 27/04/2005, 07:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Y .. probastes el otro método .. el de ver que registros debes actualizar y/o borrar en lugar de borrar todo y crearlo denuevo? ... (como para que compares .. por qué si bien ese resultado te puede parecer aceptable .. tal vez el otro método te dé alguna sorpresa (ya sea por ser mucho más rápido .. o tal vez más lento .. .. .mmmm)

Un saludo,
  #11 (permalink)  
Antiguo 04/06/2005, 18:42
gcs
 
Fecha de Ingreso: enero-2004
Ubicación: Heredia, Costa Rica
Mensajes: 191
Antigüedad: 20 años, 3 meses
Puntos: 0
XBaRt y compañeros,

Yo ando en algo parecido, pero según he preguntado la forma optima es hacerlo que actualmente haces, borrar registros y volver a cargarlos, pero disculpa mi pregnta XBaRt, como haces para hacer la inserción a la base de datos cuando con multiples checkbox ???
  #12 (permalink)  
Antiguo 13/07/2005, 01:27
 
Fecha de Ingreso: enero-2004
Ubicación: Argentina, Buenos Aires, Mar del Plata
Mensajes: 38
Antigüedad: 20 años, 3 meses
Puntos: 0
A ver, para hacer la insercion en la base de datos primero tengo que recibir los ids de los de los equipos y obviamente el id del usuario por medio de un $_POST o un $_GET (lo cual me parece seria medio feo ).
Una vez que recibo los IDs de los equipos, recorro en un foreach cada id haciendo que cada vez que entra agregue en la tabla dicho id con el id del usuario correspondiente.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:08.