Существует ли механизм хранения базы данных управления версиями?
Мне было просто интересно, существует ли тип механизма хранения, который позволял бы вам контролировать версии на уровне строк. Например, если у меня есть простая таблица с идентификатором, именем, значением и идентификатором является PK, я мог бы видеть, что строка 354 начиналась как (354, "zak", "test")v1, затем обновлялась до (354, "zak", "это версия 2 значения")v2, и может видеть историю изменений в строке с чем-то вроде select history (value), где ID = 354.
Это что-то эзотерическое, но это побило бы необходимость писать эти отдельные таблицы истории и функции каждый раз, когда вносятся изменения...
10 ответов
Кажется, вы ищете больше возможностей для аудита. Oracle и несколько других СУБД имеют полные функции аудита. Но многие администраторы баз данных все же в конечном итоге реализуют аудит строк на основе триггеров. Все зависит от ваших потребностей.
Oracle поддерживает несколько гранул аудита, которые легко настраиваются из командной строки.
Я вижу, вы помечены как MySQL, но спросили о каком-либо механизме хранения. Во всяком случае, другие ответы говорят то же самое, поэтому я собираюсь удалить этот пост, как это было первоначально о функциях воспоминаний.
Очевидно, что вы действительно ищете решение MySQL, так что это, вероятно, вам мало поможет, но в Oracle есть функция Total Recall (более формально Flashback Archive), которая автоматизирует процесс, который вы в данный момент выполняете вручную. Архив представляет собой набор сжатых таблиц, которые заполняются изменениями автоматически и могут запрашиваться простым AS OF
синтаксис.
Естественно, будучи Oracle, они платят за это: увы, ей нужна дополнительная лицензия поверх Enterprise Edition. Узнайте больше (PDF).
CouchDB имеет полное управление версиями для каждого внесенного изменения, но это часть мира NOSQL, так что, вероятно, будет довольно сумасшедший переход от того, что вы в настоящее время делаете.
В книге " Рефакторинг баз данных" есть некоторые идеи по этому вопросу.
Но это также указывает на то, что в настоящее время нет реального решения, кроме тщательного внесения изменений и управления ими вручную.
В статье в Википедии о самой популярной программе Google упоминается, что она позволяет создавать версии, добавляя измерение времени в таблицы:
Каждая таблица имеет несколько измерений (одно из которых является полем для времени, позволяющим управлять версиями).
Там также есть ссылки на несколько не-google реализаций dbms типа bigtable.
Я думаю, что Big table, движок Google DB, делает что-то подобное: он ассоциирует временную метку с каждым обновлением строки.
Может быть, вы можете попробовать Google App Engine.
В Google есть статья, объясняющая, как работает Big Table.
Oracle и Sql Server оба называют эту функцию Change Data Capture
, В настоящее время нет аналога для MySql.
Вы можете добиться аналогичного поведения с помощью триггеров (поиск "триггеры, чтобы перехватить все изменения базы данных") - особенно если они реализуют SQL92 INFORMATION_SCHEMA
,
В противном случае я бы согласился с mrjoltcola
Редактировать: Единственная ошибка, которую я бы упомянул в MySQL и триггерах, это то, что (начиная с последней загруженной мной версии сообщества) требуется, чтобы учетная запись пользователя имела SUPER
привилегия, которая может сделать вещи немного уродливыми
Одним из приближений к этому является временная база данных, которая позволяет вам видеть состояние всей базы данных в разное время в прошлом. Я не уверен, что полностью отвечает на ваш вопрос, хотя; это не позволит вам увидеть содержимое строки 1 в момент времени t1, одновременно позволяя вам посмотреть содержимое строки 2 в отдельное время t2.
"Это что-то эзотерическое, но это побило бы необходимость писать эти отдельные таблицы и функции истории каждый раз, когда вносятся изменения..."
Я бы не назвал контрольные записи (о чем вы, конечно, говорите) "эзотерикой"...
И еще: есть разница между историей обновлений баз данных и историей реальности. Исторические таблицы базы данных должны действительно использоваться для отражения истории реальности, а НЕ истории обновлений базы данных.
История обновлений базы данных уже хранится СУБД в ее журналах и журналах. Если кому-то нужно узнать историю обновлений базы данных, он должен действительно прибегнуть к журналам и журналам, а не к какой-либо конструкции уровня приложения, которая НИКОГДА не сможет обеспечить достаточную гарантию того, что она отражает ВСЕ обновления.