Как создать базу данных с историей редакций?

Я являюсь частью команды, создающей новую систему управления контентом для нашего общедоступного сайта. Я пытаюсь найти самый простой и лучший способ встроить механизм контроля версий. Объектная модель довольно проста. У нас есть абстрактный класс «BaseArticle», который включает свойства для независимых от версии / метаданных, таких как «Heading» и «CreatedBy». От него наследуются несколько классов, например DocumentArticle, у которого есть свойство URL, которое будет путем к файлу. «WebArticle» также наследуется от «BaseArticle» и включает свойство «AdditionalInfo» и коллекцию объектов «Tabs», которые включают «Body», в котором будет храниться HTML-код для отображения (объекты Tab не являются производными от чего-либо). «NewsArticle» и «JobArticle» наследуются от «WebArticle». У нас есть и другие производные классы, но они дают достаточно примеров.

Мы предлагаем два подхода к сохранению контроля версий. Я называю их «Подход1» и «Подход2». Я использовал SQL Server, чтобы составить базовую диаграмму каждого из них: Database Diagram of Approach 1 Database Diagram of Approach 2

При использовании подхода Approach1 план будет заключаться в том, чтобы свежие версии статей сохранялись через обновление базы данных. Для обновлений будет установлен триггер, который также вставит старые данные в таблицу xxx_Versions. Я думаю, что триггер нужно будет настроить для каждой таблицы.У этого подхода есть то преимущество, что в основных таблицах хранится только «головная» версия каждой статьи, а старые версии удаляются. Это упрощает копирование головных версий статей из базы данных разработки / подготовки в Live.

В случае с Подходом 2, планируется, что свежие версии статей будут вставлены в базу данных. Головная версия статей будет определяться по просмотрам. Похоже, что у этого есть преимущество меньшего количества таблиц и меньшего количества кода (например, не триггеров).

Обратите внимание, что при обоих подходах план будет заключаться в вызове хранимой процедуры Upsert для таблицы, сопоставленной с соответствующим объектом (мы должны помнить, что нужно обрабатывать случай добавления новой статьи). Эта хранимая процедура upsert будет вызывать это для класса, от которого она унаследована, например. upsert_NewsArticle вызовет upsert_WebArticle и т. д.

Мы используем SQL Server 2005, хотя я думаю, что этот вопрос не зависит от типа базы данных. Я провел несколько обширных поисков в Интернете и нашел ссылки на оба подхода. Но я не нашел ничего, что сравнивало бы эти два и показало бы, что один или другой лучше. Я думаю, что со всеми книгами по базам данных в мире этот выбор подходов, должно быть, возник раньше.

Мой вопрос: какой из этих подходов лучше всего и почему?

20
задан rahul singh Chauhan 19 July 2018 в 12:45
поделиться