es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe una mejor práctica para almacenar datos de un objeto (modelo) de base de datos que cambiará o se eliminará en el futuro (Django)?

Estoy construyendo un sistema de gestión de pedidos para una tienda en línea y me gustaría almacenar información sobre el Producto que se está ordenando.

Si utilizo una relación de clave externa para el Producto, cuando alguien cambie el precio, la marca, el proveedor, etc. del Producto o lo elimine, el Pedido se verá afectado también. Quiero que el sistema de gestión de pedidos pueda mostrar el estado del Producto cuando fue ordenado, incluso si se modifica o se elimina de la base de datos posteriormente.

He pensado mucho en ello y se me han ocurrido ideas como almacenar una representación en forma de cadena JSON del objeto; crear un Producto duplicado cuya clave externa luego utilizo para el Pedido, etc. Sin embargo, me preguntaba si existe una práctica recomendada o qué utilizan otras personas para manejar este tipo de situaciones en software comercial.

PD: También tengo otras situaciones un poco más complejas, por ejemplo, me gustaría que los datos de un objeto Usuario adjunto al Pedido cambien a medida que el Usuario cambia, pero que nunca se eliminen cuando se elimine el Usuario. Una respuesta a la pregunta anterior definitivamente me daría un buen punto de partida.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en diseño de bases de datos, recomendaría utilizar un concepto llamado “snapshotting” para almacenar información sobre el Producto que se está ordenando. El snapshotting implica crear una nueva tabla para almacenar una copia de los datos del Producto en el momento de la orden. Esta tabla tendría todos los mismos campos que la tabla de Productos, pero con la adición de un timestamp o número de orden para diferenciarla de la tabla principal de Productos.

    Cuando se realiza un pedido, en lugar de utilizar una clave externa hacia la tabla de Productos, la tabla de Pedidos tendría una clave externa hacia la tabla de snapshots. De esta manera, incluso si el Producto es modificado o eliminado de la tabla principal, el Pedido seguirá teniendo un registro del estado del Producto en el momento de la orden.

    Para manejar la situación con el objeto de Usuario, recomendaría utilizar un enfoque similar. Crear una tabla de snapshots para el objeto de Usuario que incluya todos los campos relevantes, y hacer que la tabla de Pedidos haga referencia a la tabla de snapshots en lugar de la tabla principal de Usuarios. Esto permitirá que el Pedido siempre tenga un registro de la información del Usuario en el momento de la orden, incluso si el Usuario es eliminado o modificado en la tabla principal.

    En general, el snapshotting es una práctica recomendada común para manejar este tipo de situaciones en software comercial. Proporciona una forma de almacenar un historial de datos al que se puede hacer referencia incluso después de que se realicen cambios o eliminaciones en las tablas principales.

Comments are closed.