Actualmente estamos haciendo una aplicación web cuya funcionalidad es crear Eventos por parte del usuario. Esos eventos pueden ser eliminados posteriormente por el usuario o administrador. Sin embargo, el cliente requiere que el evento no se elimine físicamente de la base de datos, sino que se marque como eliminado. El usuario solo debería ver los eventos no eliminados, pero los administradores deberían poder navegar también a través de los eliminados. Esa es realmente la funcionalidad que hay.Diseño de archivo en la base de datos. Algunos patrones tal vez?
Ahora sugerí que simplemente agreguemos una columna extra llamada "estado", que tendría un par de valores válidos: ACTIVO y ELIMINADO. De esta forma, podemos distinguir entre eventos normales (activos) y eliminados y crear consultas realmente simples (SELECCIONAR * DE EVENTOS DONDE ESTÁ = ACTIVADO). Mi colega, sin embargo, no estuvo de acuerdo. Señaló que independientemente del hecho de que en este momento los eventos activos y los eventos eliminados compartan la misma información (así pueden almacenarse en la misma tabla) en futuros requisitos, mi cambio y el cliente, por ejemplo, necesitarán almacenar información adicional sobre el evento eliminado. (como la fecha de eliminación, quién lo eliminó, por qué lo hizo, una especie de comentario). Dijo que para cumplir esos requisitos en un futuro tendríamos que agregar columnas adicionales en la tabla EVENTOS que contendrían datos específicos para los Eventos eliminados y no para los eventos activos. Propuso una solución, donde se crea una tabla adicional (como DELETED_EVENTS) con el mismo esquema que la tabla EVENTS. Cada evento eliminado se borrará físicamente de la tabla EVENTOS y se moverá a la tabla DELETED_EVENTS.
Estoy en total desacuerdo con su idea. No solo haría que las consultas SQL fueran más complejas y menos eficientes, sino que también está totalmente en contra de YAGNI. Tampoco estaba de acuerdo con él en que mi idea nos llevaría a crear columnas adicionales (no anulables) en la tabla EVENTOS, si los requisitos cambiaban en el futuro. En mi caso, simplemente crearía una nueva tabla como DELETED_EVENTS_DATA (que contendría esos datos adicionales de archivo) y añadiría la clave de referencia en la tabla EVENTS para mantener la relación de uno a uno entre las tablas EVETNS y DELETED_EVENTS_DATA.
Sin embargo, tuve problemas por el hecho de que dos desarrolladores que comúnmente comparten una visión similar del software y el diseño de bases de datos podrían tener opiniones tan radicalmente diferentes sobre cómo deberían diseñarse estos requisitos a nivel de base de datos. Pensé que tal vez ambos estábamos yendo en una dirección equivocada y hay otra (tercera) solución. ¿O hay más de una sola alternativa? ¿Cómo se diseña este tipo de requisitos? ¿Hay algún patrón o guía sobre cómo hacerlo correctamente? Cualquier ayuda será muy apreciada
Puede considerar marcar esto como una wiki de la comunidad. No estoy seguro de que encuentre una respuesta verificablemente correcta. – Mayo
Esta es una gran pregunta y estoy deseando ver algunas de las respuestas que se muestran. La eliminación de filas de la tabla cuando se copia en una tabla DELETED_EVENT puede causarle algunos problemas si hay alguna referencia a su tabla EVENTOS que deba mantener para propósitos históricos.O bien terminará colgando claves foráneas, o claves externas en las que potencialmente podría tener que unirse con ambas tablas. No suena bonito. – rayd09
¿Por qué mi respuesta fue eliminada de ser la respuesta? – anthonyv