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

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

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

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

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

23
задан Proxium 17 December 2015 в 19:59
поделиться

5 ответов

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

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

Простой способ сделать это - создать таблицу со следующими полями:

  • id
  • companyId
  • number
  • timestamp

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

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

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

SELECT * FROM table WHERE companyId = X
1
ответ дан 29 November 2019 в 02:04
поделиться

Вы должны использовать дополнительный уровень между вашим приложением и базой данных. Вы можете сделать очень простой по своему усмотрению (вместо прямого вызова 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 , вы можете использовать его прослушиватели событий , чтобы получить то, что вам нужно.

2
ответ дан 29 November 2019 в 02:04
поделиться

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

Каждый раз, когда вы обновляете фактическую таблицу, вы также ВСТАВЛЯЕТЕ новую строку в таблице версий с повторяющимися данными. Всякий раз, когда вы хотите найти историю версий, все, что вам нужно сделать, это что-то вроде 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

11
ответ дан 29 November 2019 в 02:04
поделиться

Это не регистрация фактических обновлений 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'

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

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

1
ответ дан 29 November 2019 в 02:04
поделиться

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

Дополнительные сведения см. В http://dev.mysql.com/doc/refman/5.1/en/triggers.html .

19
ответ дан 29 November 2019 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: