Я являюсь частью команды, создающей новую систему управления контентом для нашего публичного сайта.Я пытаюсь найти самый простой и лучший способ встроить механизм контроля версий.Объектная модель довольно проста.У нас есть абстрактный класс «BaseArticle», который включает свойства для независимых от версии / метаданных, таких как «Заголовок» и «CreatedBy».Ряд классов наследуется от этого, например, «DocumentArticle», который имеет свойство «URL», который будет путь к файлу.«WebArticle» также наследует от «BaseArticle» и включает в себя свойство «ДалееInfo» и коллекцию объектов «Tabs», которые включают в себя «Body», который будет содержать HTML-код для отображения (объекты Tab не являются производными от чего-либо).«NewsArticle» и «JobArticle» наследуют от «WebArticle».У нас есть другие производные классы, но они предоставляют достаточный пример.
Мы придумали два подхода к сохранению для Revision Control.Я называю это «подход 1» и «подход 2».Я использовал SQL Server для составления базовой диаграммы каждого из них:
При подходе 1 план будет предусматривать сохранение свежих версий статей через обновление базы данных.Триггер будет установлен для обновлений и вставит старые данные в таблицу xxx_Versions.Я думаю, что триггер должен быть настроен на каждой таблице.Преимущество этого подхода состоит в том, что в основных таблицах хранится единственная «головная» версия каждой статьи, а старые версии отключаются.Это облегчает копирование головных версий статей из базы данных разработки / подготовки в живую.
При подходе 2 планируется, что свежие версии статей будут вставлены в базу данных.Главный вариант статей будет определен через представления.Кажется, в этом есть преимущество: меньше таблиц и меньше кода (например, не триггеров).
Обратите внимание, что при обоих подходах планируется вызвать хранимую процедуру Upsert для таблицы, сопоставленной с соответствующим объектом (мынеобходимо помнить, чтобы обрабатывать случай добавления новой статьи).Эта хранимая процедура upsert вызовет так, что для класса, из которого она получена, например, upsert_NewsArticle вызовет upsert_WebArticle и т. Д.
Мы используем SQL Server 2005, хотя я думаю, что этот вопрос не зависит от вида базы данных.Я провел несколько обширных поисков в интернете и нашел ссылки на оба подхода.Но я не нашел ничего, что сравнило бы эти два и показало бы одно или другое, чтобы быть лучше.Я думаю, что со всеми книгами по базам данных в мире, этот выбор подходов должен был возникнуть раньше.
Мой вопрос: какой из этих Подходов является лучшим и почему?