Pronto comenzaré a trabajar en un proyecto que (a partir de la especificación) me recuerda un poco a StackOverflow. Básicamente, es una aplicación web que tiene contenido controlado por el usuario.Implementando la versión Control de objetos DB
Una de las características que me hace dar vueltas en mi mente es el control de versiones. Aquí en StackOverflow, cada pregunta y respuesta puede tener múltiples revisiones. Esto es bastante simple de implementar cuando solo tiene un tipo de objeto (y, en este caso, su texto).
Por lo tanto, para mis páginas simples, estoy configurado.
El problema aparece cuando considero que algunos objetos que deben estar bajo control de versiones tienen relaciones. Para proporcionar un ejemplo concreto, permítanme elegir un dominio aleatorio análogo:
Digamos que estaba implementando un sitio similar a Wiki para hacer un seguimiento de la información del libro/autor. El objetivo principal del sitio sería crear y actualizar páginas de "Autor", que, como texto, es bastante simple (como se indicó anteriormente). Sin embargo, agreguemos una asociación uno a muchos entre autores y libros (en otras palabras, los libros serían objetos separados, ya que obviamente una persona podría autorizar muchos libros). Cada libro tendría un enlace desde la página del autor a una página informativa sobre ese libro.
Para el usuario, hay poca diferencia entre el "Resumen" basado en texto que describe el autor y los vínculos entre ese autor & sus obras. Por lo tanto, tenemos un requisito para implementar la función de "revisión"/edición para páginas de autor, páginas de libros, y, la asociación entre autores y libros. En otras palabras, el usuario debería poder editar, ver el historial de y deshacer páginas de autor, páginas de libros y asociaciones entre los dos.
Esto se vuelve aún más complicado cuando esa relación se convierte en una relación de muchos a muchos, donde se pueden enumerar varios autores que contribuyeron a un libro.
Tengo una serie de soluciones en mente, pero ninguna de ellas es tan limpia como me gustaría (e involucran al menos algunos códigos repetidos/almacenamiento de datos redundantes), y, aunque veo algo común en todo el lugar aquí, siento que realmente no he podido extraerlo mejor, especialmente a nivel de base de datos. No quiero sesgar las respuestas dadas, así que no voy a darlas de inmediato.
Entonces, ¿cómo diseñaría este sistema a nivel de base de datos? Estoy buscando las especificaciones de la tabla aquí, y posiblemente una descripción de cómo las usaría, si no es inmediatamente obvio. Para aquellas respuestas que puedan ser relevantes, voy a usar ASP.NET y Linq-to-SQL (me siento cómodo con many-to-many en LTS) o Entity Framework.
EDIT: Para aclarar, entiendo el diseño básico de DB, normalización, tablas de asignación de muchos a muchos, etc. Estoy buscando una solución limpia para esta situación específica.
EDIT 2: Estoy buscando una solución generalizable, ya que puede haber más subobjetos en el sistema que solo libros. El autor puede estar relacionado con otros autores, revistas, eventos, etc., etc. Siento que estoy repitiendo mucho trabajo si implemento el historial individualmente para cada uno.
@JoshJordan: No te disculpes. Arregla la pregunta para ser más al grano. –