Один метод, который используется несколькими вики-платформами, заключается в разделении идентифицирующих данных и контента, который вы проверяете. Это добавляет сложности, но в итоге вы получаете контрольный журнал с полными записями, а не просто списки полей, которые были отредактированы, и которые вам нужно будет затем объединить, чтобы дать пользователю представление о том, как выглядела старая запись.
Так, например, если у вас есть таблица с именем Возможности для отслеживания сделок продажи, вы фактически создадите две отдельные таблицы:
Возможность
Opportunities_Content (или что-то в этом роде)
Таблица Opportunities будет содержать информацию, которую вы будете использовать для уникальной идентификации записи, и будет содержать первичный ключ, на который вы будете ссылаться для ваших отношений с внешним ключом. Таблица Opportunities_Content будет содержать все поля, которые могут изменить ваши пользователи и для которых вы хотите вести контрольный журнал. Каждая запись в таблице Content будет содержать свой собственный PK и данные с изменениями и датами изменения. Таблица Opportunities будет содержать ссылку на текущую версию, а также информацию о том, когда основная запись была создана и кем.
Вот простой пример:
CREATE TABLE dbo.Page(
ID int PRIMARY KEY,
Name nvarchar(200) NOT NULL,
CreatedByName nvarchar(100) NOT NULL,
CurrentRevision int NOT NULL,
CreatedDateTime datetime NOT NULL
И содержание:
CREATE TABLE dbo.PageContent(
PageID int NOT NULL,
Revision int NOT NULL,
Title nvarchar(200) NOT NULL,
User nvarchar(100) NOT NULL,
LastModified datetime NOT NULL,
Comment nvarchar(300) NULL,
Content nvarchar(max) NOT NULL,
Description nvarchar(200) NULL
Вероятно, я бы сделал PK таблицы содержимого ключом из нескольких столбцов из PageID и Revision при условии, что Revision был типом идентификации. Вы бы использовали колонку Revision в качестве FK. Затем вы извлекаете консолидированную запись, присоединяясь так:
SELECT * FROM Page
JOIN PageContent ON CurrentRevision = Revision AND ID = PageID
Там могут быть некоторые ошибки ... это не в моей голове. Это должно дать вам представление об альтернативном паттерне.