Я никогда не находил отличного решения всех проблем такого типа. Некоторые вещи, которые вы можете попробовать, - это если ваша БД поддерживает разбиение на разделы (или даже если вы этого не сделаете, вы можете реализовать ту же концепцию самостоятельно), но разделить эту таблицу журналов по типу объекта, а затем вы сможете продолжить разбиение по дате / времени или вашим Идентификатор объекта (если ваш идентификатор числовой, это прекрасно работает, не знаю, как будет разделен guid).
Это поможет сохранить размер таблицы и сохранить все связанные транзакции для одного экземпляра объекта для себя.
Одна из идей, которую вы могли бы изучить, состоит в том, что вместо сохранения каждого поля в таблице пар имя-значение вы можете хранить данные в виде большого двоичного объекта (текстового или двоичного). Например, сериализовать объект в Xml и сохранить его в поле.
Недостатком этого является то, что при изменении вашего объекта вы должны учитывать, как это влияет на все исторические данные, если вы используете Xml, тогда есть простые способы обновить исторические структуры XML, если вы используете бинарный файл, есть способы, но вы должны будьте более осторожны в усилиях.
Я добился огромного успеха, сохранив довольно сложную объектную модель с множеством взаимосвязей в виде большого двоичного объекта (сериализатор xml в .net не обрабатывал отношения между объектами). Я мог очень легко видеть себя хранящим двоичные данные. Огромным недостатком хранения его в виде двоичных данных является то, что для доступа к нему вам нужно вынуть его из базы данных с помощью Xml, если вы используете современную базу данных, такую как MSSQL, вы можете получить доступ к данным.
Последний подход заключается в разделении двух шаблонов. Вы можете определить разностную схему (и я предполагаю, что за один раз изменяется более одного свойства), так что, например, представьте себе, как хранить этот xml:
<objectDiff>
<field name="firstName" newValue="Josh" oldValue="joshua"/>
<field name="lastName" newValue="Box" oldValue="boxer"/>
</objectDiff>
Это поможет уменьшить количество строк, и, если вы используете MSSQL, вы можете определить XML-схему и получить некоторые богатые возможности запросов вокруг объекта. Вы все еще можете разделить таблицу.
Josh