Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: gatoher en 18 de Agosto 2014, 21:09

Título: Eliminar datos de tablas relacionadas con mysql y java
Publicado por: gatoher en 18 de Agosto 2014, 21:09
Hola a todos estoy haciendo en Java con MySql un ejercicio para almacenar reservas de un hotel. El problema que tengo es que las siguientes tablas relacionadas.

Persona => Cliente => Habitacion => Consumiciones

Al intentar eliminar un cliente que no ha reservado una habitación  no hay problema, pero al eliminar una reserva de habitacion, "un cliente puede hacer varias reservas,osea puede reservar varias habitaciones y cada habitación  puede tener varias  consumiciones", bueno pues esto no me deja hacerlo por las claves ajenas.

Entonces he pensado sacar todas las habitaciones que un cliente tiene, supongamos 3,"habitación 5,10,20" almacenar el número de cada habitación en un array y luego con un for ir eliminado todas las consumiciones,"la tabla consumiciones tiene el id de la habitación que hace el pedido".

¿Esto estaría bien hecho?. La verdad que este problema lo tengo bastante.

 

Agradeceria cualquier comentario. Saludos
Título: Re:Eliminar datos de tablas relacionadas
Publicado por: Mastermind en 18 de Agosto 2014, 23:54
Hola, lo primero que debes tener en cuenta es que cada tabla debe tener su id único y luego puede relacionar con otras tablas a través de un id ajeno.

Por ejemplo Consumiciones tendría:

IdConsumicion IdHabitacion PrecioConsumisicion TipoConsumicion etc.


Para saber a qué habitación corresponde una consumición tienes el IdHabitación.

Ahora supongamos que quieres eliminar un cliente.

En la tabla Habitación puedes tener algo como:

IdHabitacion IdCliente NumeroHabitacion CamasHabitación etc.


Si eliminas el cliente con IdCliente 782, antes de eliminar esa línea de la tabla Cliente tendrás que recorrer las tablas donde aparezca el IdCliente 782 y decidir qué haces con esa información. Si la quieres eliminar de la tabla Habitación, podrías poner en la fila afectada como IdCliente -1, siendo -1 una señal de que la habitación no tiene cliente asociado.

Las consumiciones tienes que pensar si necesitas la información "histórica" o no, si no la necesitas procederías a un borrado tal y como has señalado, pero lo primero será tener claro cuál es la lógica de operación que quieres aplicar y si es necesario, proceder a borrados tal y como indicas.

Saludos!
Título: Re:Eliminar datos de tablas relacionadas
Publicado por: gatoher en 19 de Agosto 2014, 16:58
Hola Mastermind, revisando ayer me di cuenta que al meter la base de datos en el MySql no había puesto las opciones de Integridad Referencial. Vamos que ante delete, update no había puesto poner a null o cascade.
Voy adjuntar una imagen de la base, "¿como se sube al post una imagen?, cuando pincho en el icono me aparecen las etiquetas IMG, pero no se como hacerlo."

Bueno para solucionarlo lo que hice fue poner ON DELETE CASCADE en la tabla idcliente de manera que al borrar un cliente se elimina su reserva pero permanece el consumo, este no se borra.

No llevo mucho tiempo con esto y no se si es una solución óptima.




Título: Re:Eliminar datos de tablas relacionadas
Publicado por: Mastermind en 19 de Agosto 2014, 17:10
Para insertar una imagen tiene que estar en un servidor (no sirve en tu propio computador) y conocer la url. Por ejemplo si la imagen es http: //w ww.jhcnewmedia.org/gestion/wp-content/uploads/2010/05/202417519_59dcc2d5151.jpg

Pulsas en el icono de imagen y pegas la ruta entre las dos etiquetas img y /img y te queda así (luego le das a centrar):

(http://www.jhcnewmedia.org/gestion/wp-content/uploads/2010/05/202417519_59dcc2d5151.jpg)

Si solo la tienes en tu computador tienes que hacer como has hecho, adjuntarla como archivo.

La solución on delete no es mala ni buena por sí misma, primero tienes que pensar cuál es tu objetivo y si con esa solución lo cumples puedes darla por buena. Eso implica un borrado automático, si eso es lo que quieres es buena solución, pero si no quieres el borrado automático tendrías que buscar otras alternativas. Saluds,