Foros del Web » Programación para mayores de 30 ;) » Programación General »

Una duda sobre eliminacion de registros a nivel lógico!

Estas en el tema de Una duda sobre eliminacion de registros a nivel lógico! en el foro de Programación General en Foros del Web. Buenas Amigos, tengo una dificultad, estoy realizando un sistema para la empresa donde trabajo; lo programo con php, html, javascript, xml, mysql (en síntesis AJAX). ...
  #1 (permalink)  
Antiguo 20/09/2006, 13:35
Avatar de mape367  
Fecha de Ingreso: noviembre-2004
Ubicación: CDE, Paraguay
Mensajes: 213
Antigüedad: 19 años, 6 meses
Puntos: 3
Una duda sobre eliminacion de registros a nivel lógico!

Buenas

Amigos, tengo una dificultad, estoy realizando un sistema para la empresa donde trabajo; lo programo con php, html, javascript, xml, mysql (en síntesis AJAX).

Sucede lo sigueinte, estoy eliminando registros de forma lógica, poniendo una bandera de activo/inactivo. Cuando consulto registros de cualquier tabla, siempre incluyo la condicion de que esté activo en la consulta.

Me surgio una dificultad, Tengo un (ABM) de por ejemplo ciudades, luego, en la tabla ciudades tengo un campo país (clave foránea).

Pues bien, al eliminar un registro de la tabla paises, las ciudades vinculadas a él, continuan con la integridad porque sólo elimino logicamente.

El problema esta en que en el ABM de ciudades tengo un combo, que hace referencia a los paises. Como acabo de borrar un país, con la ciudad vinculada a éste tendria una pequeña dificultad. Resulta que los datos del combo se traen de la tabla paises utilizando el filtro de estado (0/1), por esta razon, dicho pais no estará en la lista, pero la ciudad todavia hace la referencia a éste.

Que pasa cuando quiero modificar los datos de la ciudad, el pais no me mostrará por no estar cargado en el combo.

Alguna sugerencia de como solucionarlo?

He pensado en unas tecnicas de integridad referencia pero no acaban de convencerme!

Desde ya muchas gracias, saludos
  #2 (permalink)  
Antiguo 20/09/2006, 17:47
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
En cierta manera, la solucion mas obvia seria la eliminacion logica por la eliminacion fisica.

Otra solucion mas viable, seria la de incluir trigers que se disparen cuando modificas el estado de un pais (de activo a desactivado y viceversa), lo que haria este triger seria activaor o desactivar las ciudades que correspondan al pais que estas desactivando. Creo que esto tambien se podria hacer con un store procedure. Basicamente seria como colocar un ON DELETE CASCADE a la tabla.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #3 (permalink)  
Antiguo 21/09/2006, 05:36
Avatar de mape367  
Fecha de Ingreso: noviembre-2004
Ubicación: CDE, Paraguay
Mensajes: 213
Antigüedad: 19 años, 6 meses
Puntos: 3
Gracias por la respuesta TolaWare, estuve pensando en tu respuesta, y me parece válida, pero encontre un inconveniente.

En realidad lo del ABM sólo era un ejemplo, ya que tendria que estar manejandome de esa manera en todo el sistema, el número de trigers que tendria sería muy numeroso.

Otra alternativa que encontre fue la siguiente:

Cada vez que intento borrar un registro, inicio una transacción (Begin), luego, dentro de la transacción ejecuto la instrucción Delete, en ese punto verifico si la instrucción se realizó correctamente, si es así, cambio el estado del registro para desactivado, si la instrucción delete falla, no permito la eliminación lógica de dicho registro.

Logicamente cualquiera sea el resultado de la instrucción delete, luego ejecuto un rollback, para recuperar dicho registro.

Me podrian ayudar con el analisis de esta alternativa? Es viable? Ventajas y desventajas...

Desde ya muchas gracias por su valiosa colaboración...

Saludos.
  #4 (permalink)  
Antiguo 23/09/2006, 08:07
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
A simple vista parece viable.
Como desventaja podria ser que estarias ejecutando muchas sentencias SQL, de las cuales siempre se hace un roolback. Por lo que estyas sobrecargando al DBMS innecesariamente. Si tu aplicacion se ejecutará en 2 o 3 maquinas con unas pocas consultas por minutos, digamos unas 20 por minuto, entonces no te dara porblemas mayores.
En cambio si tu aplicacon va a someter al motor de base de datos a muchas consultas por minuto, mas de 50, entonces esto podria ocasionarte problemas.


Desde un punta de vista practico, es probable que el enfoque planteas, funcione bien. Ahora, si lo que buscas es un buen diseño de software, pues no vas por buen camino.

Digo esto porque en un buen diseño de software, se busca (por ejemplo)
que la aplicacion funcione con cualquier tipo de perisstencia, en otras palabras que podamos cambiar de una BD relacional a una BD jerarquica o a la escritura de archivos binarios, solo con efectos menores en la aplicacion.
En la solucion que planteaste, si el motor de DB, no soporta transacciones entonces la aplicaicon no funciona.

Bueno, que mi humilde comentario te sirva de algo
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
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 03:20.