14

Soy parte de un equipo que está creando un nuevo Sistema de administración de contenido para nuestro sitio público. Estoy tratando de encontrar la forma más fácil y la mejor manera de incorporar un mecanismo de control de revisión. El modelo de objetos es bastante básico. Tenemos una clase abstracta "BaseArticle" que incluye propiedades para la versión independiente/metadatos como "Encabezado" & "CreatedBy". Un número de clases hereda de esto, como "DocumentArticle" que tiene la propiedad "URL" que será una ruta a un archivo. "WebArticle" también hereda de "BaseArticle" e incluye la propiedad "FurtherInfo" y una colección de objetos "Tabs", que incluyen "Body" que contendrá el HTML que se mostrará (los objetos Tab no se derivan de nada). "NewsArticle" y "JobArticle" heredan de "WebArticle". Tenemos otras clases derivadas, pero estas proporcionan suficiente de un ejemplo.¿Cómo diseñar una base de datos con historial de revisiones?

Tenemos dos aplicaciones para la persistencia del control de revisión. Yo llamo a estos "Approach1" y "Approach2". He utilizado SQL Server para hacer un diagrama básico de cada uno: Database Diagram of Approach 1Database Diagram of Approach 2

Con Approach1, el plan sería que las nuevas versiones de los artículos se conservaran mediante una actualización de la base de datos. Se establecería un disparador para las actualizaciones e insertaría los datos antiguos también en la tabla xxx_Versions. Creo que un disparador debería estar configurado en cada mesa. Este enfoque tiene la ventaja de que la única versión de "cabeza" de cada artículo se mantiene en las tablas principales, con versiones antiguas que se ocultan. Esto hace que sea fácil copiar las versiones principales de los artículos de la base de datos de desarrollo/estadificación a Live.

Con Approach2, el plan sería insertar nuevas versiones de artículos en la base de datos. La versión principal de los artículos se identificará a través de vistas. Esto parece tener la ventaja de tener menos tablas y menos código (por ejemplo, no activadores).

Tenga en cuenta que con ambos enfoques, el plan sería llamar a un procedimiento almacenado Upsert para la tabla asignada al objeto relevante (debemos recordar manejar el caso de un nuevo artículo que se agrega). Este procedimiento almacenado ascendente llamaría eso para la clase de la cual deriva, p. upsert_NewsArticle llamaría upsert_WebArticle etc.

Estamos utilizando SQL Server 2005, aunque creo que esta pregunta es independiente del sabor de la base de datos. He realizado una extensa búsqueda de Internet y he encontrado referencias a ambos enfoques. Pero no he encontrado nada que compare los dos y muestra que uno u otro son mejores. Creo que con todos los libros de bases de datos en el mundo, esta elección de enfoques debe haber surgido antes.

Mi pregunta es: ¿cuál de estos enfoques es mejor y por qué?

+0

¿Ha considerado comprar un CMS y personalizarlo? Son engañosamente difíciles de usar y consumen mucho tiempo para construir bien. Puede terminar siendo bastante caro. –

+0

Ciertamente se vuelve bastante complicado cuando se pasa de la visión a la implementación. Pero creo que tenemos las habilidades para construir lo que necesitamos ... Solo quiero asegurarme de hacer el backend lo mejor que podamos. Además, si escogiéramos una solución lista para usar, me quedaría la pregunta teórica de qué enfoque tomar :-(Por cierto, ver los comentarios que hice a la publicación de Blender para enlaces a páginas interesantes. – daniel

Respuesta

4

Discutiría Método 2. Es más simple, parece ser mucho más fácil de implementar y proporciona la misma funcionalidad que Approach 1.

¿Qué más puedo agregar?

+1

Hola Blender. Mi reacción visceral es como la tuya: Approach2 es la más simple, pero un cuerpo sustancial de opiniones promueve a Appraoch 1. Revisa [Greenspun] (http://philip.greenspun.com/seia/content-management). El párrafo que comienza es "There". son dos maneras clásicas de implementar una pista de auditoría en un RDBMS "coincide con mi problema.Él no es explícito, pero proporcionar ejemplos para Approach1 implica que lo prefiere. Busco un método para equilibrar los recursos de la computadora v la simplicidad del código. Un problema normal, pero esperaba que hubiera sido resuelto definitivamente para este caso especial. – daniel

+0

BTW, el CMS más desarrollado que he podido encontrar es un esquema - [schema] (http://upload.wikimedia.org/wikipedia/commons/b/b7/MediaWiki_database_schema_1-17_%28r82044%29 .png). Parece que usan Approach2, pero cuelgan los artículos eliminados en una tabla de "Archieve". – daniel

Cuestiones relacionadas