Как сохранить историю обновлений записей в MySQL?

Я должен создать код на PHP, который позволит мне сохранить историю обновлений записей в базе данных MySQL, чтобы я мог найти по дате старую ревизию.

Вот пример того, что я действительно хочу достичь: http://en.wikipedia.org/w/index.php?title=Tunisia&action=history

Данные в основном являются числами, которые мы записываем о компании для создания отчетов и для извлечения индексов.

Я планирую использовать codeigniter для его простоты, и я ищу идею о структуре или проекте с открытым исходным кодом, которые используют тот же подход, чтобы сохранить историю изменений в базе данных.

Solutions Collecting From Web of "Как сохранить историю обновлений записей в MySQL?"

Самое простое решение (в зависимости от ваших конкретных потребностей), вероятно, должно заключаться в добавлении триггера update / insert / delete в вашу таблицу, поэтому вы можете выполнять дополнительную регистрацию, когда данные вставляются / обновляются / удаляются. Таким образом, будут рассмотрены даже ручные вмешательства на db …

Для получения дополнительной информации посетите http://dev.mysql.com/doc/refman/5.1/en/triggers.html .

Один простой способ сохранить историю версий – создать в основном идентичную таблицу (например, с суффиксом _version). Обе таблицы будут иметь поле версии, которое для основной таблицы вы увеличиваете для каждого обновления, которое вы делаете. Таблица версий будет содержать составной первичный ключ (id, version) .

Всякий раз, когда вы делаете обновление в фактической таблице, вы также INSERT новую строку в таблице версий с дублирующимися данными. Всякий раз, когда вы хотите найти историю версий, все, что вам нужно сделать, это нечто вроде SELECT * FROM content_version WHERE id = CONTENT_ID ORDER BY version .

Если вы используете что-то вроде Doctrine ORM, у него есть поведение, которое автоматически выполняет это через прослушиватели событий. Вы можете проверить это здесь: http://www.doctrine-project.org/documentation/manual/1_2/en/behaviors#core-behaviors:versionable

Существует инфраструктура с открытым исходным кодом (MIT) для создания CRM и ERP-типов веб-приложений, управляемых базами данных. Вы можете скачать EPESI из http://epe.si/, также доступного на SourceFroge: http://sourceforge.net/projects/epesi/

Двигатель CRES от EPESIRecord Browser – имеет очень эффективную историю записи, а также другие функции, такие как расширенная система разрешений (вплоть до уровня поля) и многое другое.

Один набор записей хранит данные в целых 10 таблицах, и это агностик базы данных (использует PHPAdoDB). Таблица, называемая recordset_data, хранит «сырые» данные и историю изменений, хранится в двух дополнительных таблицах: recordset_edit_history и recordset_edit_history_data .

Запись edit_history записи имеет следующую структуру:

  • ID (первичный ключ для этой таблицы, индекс)
  • Отредактировано: (timestamp: 2008-05-14 15:18:15)
  • Отредактировано: (ID пользователя)

Запись edit_history_data записи имеет следующую структуру:

  • edit_id = ID из истории изменений
  • field = имя поля, которое было изменено
  • old_value = значение измененного поля.

Это очень быстрый и эффективный движок, и он хранит изменения не в записи, а на одном полевом уровне.

Вы должны использовать дополнительный слой между вашим приложением и db. Вы можете сделать очень просто самостоятельно (вместо прямого вызова mysql_query вы вызываете функцию, mysql_query вами, которая обертывает ее и отслеживает обновления), или используйте некоторые существующие ORM. В псевдокоде

 my_mysql_query($query){ if($query is an update){ //Log stuff before query } $r = mysql_query($query); if ($r && $query is an update){ //Log stuff after query } return $r; } 

А затем в вашем приложении вы вызываете my_mysql_query вместо mysql_query . Вы можете проверить, является ли таблица той, которую вы хотите отслеживать, и вы можете скопировать строку в копию исходной таблицы.

Если вы используете Doctrine ORM , вы можете использовать его прослушиватели событий, чтобы получить то, что вы хотите.

Это не регистрация фактических обновлений SQL. Он регистрирует обновления данных. Фактически это будет хранить каждую ревизию страницы и просто предоставлять последнюю по умолчанию. Код SQL, который использовался для него, не был сохранен.

Таким образом, вам придется придерживаться аналогичного подхода. Каждый раз, когда данные изменяются, вам нужно будет выяснить, как данные изменились и сохранить данные «патча». Вероятно, вам лучше всего сохранить последнюю версию, а затем придется работать через все патчи, чтобы добраться до нее. Это означает, что вы сможете увидеть что-то вроде

 ! created file * added data to cell D4 'product descript' D5 'set of pens' E5 '£5.99' * added data to cell D6 'toaster' E5 '£10' & changed data in cell D4 'Product Description' 

Каждое из этих изменений должно храниться с отметкой времени или когда они будут сделаны. Вам также нужно будет разработать свою собственную схему для хранения изменений данных.

Другим более простым решением было бы использовать движок вики, который предоставляет все необходимые функции, если вы хотите работать на веб-странице. Возможно, вам придется потратить некоторое время, чтобы он работал лучше для ваших нужд, позволяя людям редактировать его из более готового вида, а не из исходной вики.

Если я правильно понимаю, вы сохраняете только «число» в определенной таблице, и хотите ли вы историю изменений этого номера?

Я бы сказал: напишите свой datamodel, чтобы он содержал историю этого числа. Таким образом, вы не только записываете последнее значение этого числа, но также сохраняете любые предыдущие значения.

Простым способом сделать это является наличие таблицы со следующими полями:

  • Я бы
  • Идентификатор компании
  • номер
  • отметка времени

Если вы хотите узнать текущий номер, просто выполните

 SELECT * FROM table WHERE companyId = X ORDER BY timestamp DESC LIMIT 1 

Если вы хотите увидеть все изменения, выполните следующие действия:

 SELECT * FROM table WHERE companyId = X