Ver Mensaje Individual
  #12 (permalink)  
Antiguo 19/05/2011, 23:09
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: problemas al insertar datos en dos tablas

Hola,

Cita:
Iniciado por Juanchooo Ver Mensaje
... Una vez que el usuario busque: tal disenador + tal proyecto, tu obtendras un registro cpn su respectivo id, y asi para posteriores consultas o para relacionar con otras tablas ya solo haras referencia a ese id y no volveeeeeer a hacer las consultas comparando con iddisenador + idproyecto( q flojera no?), solo por practicidad. ...
Odio tener que llevarte la contraria, es decir, no pienses que lo hago por ningún motivo diferente a facilidad y obtener resultados prácticos, y solamente estoy siendo objetivo sobre el problema.

Primer problema, además de la llave primaria tendrías que definir un índice secundario de tipo único (unique) para que id_diseñador e id_proyecto no se repitan, lo cual podría tener consecuencias graves como resultados duplicados en los reportes. Si la llave primaria es id_diseñador + id_proyecto automáticamente es un indice único. Y ya sabemos lo que pasa cuando agregamos índices por doquier a tablas grandes, y muchas veces la llave primaria está 'clusterada'.

Otro problema, para obtener ese id_proyecto_diseñador primero tuviste que hacer una consulta para obtenerlo y posteriormente otra para realizar la acción. Como por ejemplo:

Pseudocódigo (código que no es ningún lenguaje de programación especifico):
Código:
$idp = 1;
$idd = 1;
$res = select id_proyecto_diseñador from tabla where id_proyecto = $idp and id_disenador = $idd;
update tabla set (data = algo) where id_proyecto_diseñador = $res;
delete from tabla where id_proyecto_diseñador = $res;
Mientras que podrías haber hecho:
Código:
$idp = 1;
$idd = 1;
update tabla set (data = algo) where id_proyecto = $idp and id_disenador = $idd;
delete from tabla id_proyecto = $idp and id_disenador = $idd;
No le veo la complejidad al asunto. Y no usé el id_proyecto_diseñador.

Una solución que es práctica, si vas a hacer una relación a otra tabla, en la otra tabla tienes que tener el id_disenador y el id_proyecto, y haces la relación a los dos campos (igual que la llave primaria a dos campos). Si quieres obtener los registros de la otra tabla solamente haces un query, veamos un ejemplo de una relación a otra tabla con nombre elegidos:

Esto te da todos los nombres de los elegidos que pertenecen al proyecto 1.
Código:
select nombre from elegidos where id_proyecto = 1;
Mientras que si lo haces por el id_proyecto_disenador quedaría así:
Código:
select nombre from elegidos a
inner join tabla b on a.id_proyecto_disenador = b.id_proyecto_disenador
where b.id_proyecto = 1;
Y repito no es mi intención llevarte la contraria, he diseñado muchas aplicaciones de todo tipo y en las relaciones uno a muchos y uno a muchos de tres tablas, nunca me ha servido ese campo sino es para complicar las cosas.

Ahora piensa en usa misma estructura en cascada en doce niveles. Yo puedo sacar el ID_Corporacion de la tabla Usuarios, porque el Usuario no tiene un ID_Corporacion_Empresa_Departamento_Usuario sino tiene un ID_Corporación + ID_Empresa + ID_Departamento + IDUsuario como llave primaria.

Cita:
Iniciado por matt_1985 Ver Mensaje
$sql_imagen="INSERT INTO proyectos (archivo,nombreproyecto,idareaespecializacion,fech a) values('".$HTTP_POST_FILES['archivo']['name']."','".$_POST["nombreproyecto"]."','".$_POST["areaespecializacion"]."',NOW())";
//$result_imagen=mysql_query($sql_imagen,$link);
$result_imagen=mysql_query($sql_imagen,$link) or die ("consulta1: ".mysql_error());

$sqlx="INSERT INTO proyectodisenador (iddisenador,idproyecto) values('".$_POST["iddisenador"]."','".$_POST["idproyecto"]."')";
//$resultx=mysql_query($sqlx,$link);
$resultx=mysql_insert_id($sqlx,$linkx) or die ("consulta2: ".mysql_error());
Pues no sé exactamente de donde sacaste esa idea, y no sé si te tomaste la molestía de leer la información que está en el manual de PHP.

Código:
$sql_imagen="INSERT INTO proyectos (archivo,nombreproyecto,idareaespecializacion,fecha) values('".$HTTP_POST_FILES['archivo']['name']."','".$_POST["nombreproyecto"]."','".$_POST["areaespecializacion"]."',NOW())";
$result_imagen=mysql_query($sql_imagen,$link) or die ("consulta1: ".mysql_error());
$id = mysql_insert_id($link);
$sqlx="INSERT INTO proyectodisenador (iddisenador,idproyecto) values('".$_POST["iddisenador"]."','".$id."')";
$resultx=mysql_query($sqlx,$link);
$resultx=mysql_insert_id($sqlx,$linkx) or die ("consulta2: ".mysql_error()); 
Bueno, da igual, espero haber sido de alguna ayuda,
Saludos.

Última edición por HackmanC; 19/05/2011 a las 23:35 Razón: EDIT