Добавление измерения времени к ячейкам MySQL - PullRequest
2 голосов
/ 10 августа 2009

Есть ли способ сохранить отметку времени каждого изменения в каждом столбце каждой строки в таблице MySQL? Таким образом, я никогда не потеряю данные и не буду вести историю переходов. Удаление строки может быть просто установкой для «удаленного» столбца значения true, но его можно будет восстановить.

Я смотрел на HyperTable , реализацию с открытым исходным кодом Google BigTable , и эта функция действительно намочила мне рот. Было бы замечательно, если бы он был в MySQL, потому что мои приложения не обрабатывают огромный объем данных, которые оправдывают развертывание HyperTable. Подробнее о том, как это работает, можно узнать здесь .

Есть ли какая-либо конфигурация, плагин, вилка или что-то еще, что добавило бы только одну эту функциональность в MySQL?

Ответы [ 4 ]

3 голосов
/ 10 августа 2009

Я реализовал это в прошлом в php-модели, аналогичной описанной в хаосе.

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

http://dev.mysql.com/doc/refman/5.0/en/stored-routines.html

2 голосов
/ 10 августа 2009

Создать таблицу, в которой хранится следующая информация ...

CREATE TABLE MyData (
    ID INT IDENTITY,
    DataID INT )

CREATE TABLE Data (
    ID INT IDENTITY,
    MyID INT,
    Name VARCHAR(50),
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)

Теперь создайте sproc, который делает это ...

INSERT Data (MyID, Name)
VALUES(@MyID,@Name)

UPDATE MyData SET DataID = @@IDENTITY
WHERE ID = @MyID

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

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

2 голосов
/ 10 августа 2009

Я делаю это в пользовательских рамках. Каждое определение таблицы также генерирует таблицу журнала, связанную многие-к-одному с основной таблицей, и когда инфраструктура выполняет какое-либо обновление строки в основной таблице, она вставляет текущее состояние строки в таблицу журнала. Итак, у меня есть полный контрольный журнал о состоянии таблицы. (У меня есть записи времени, потому что все мои таблицы имеют столбцы LoggedAt.)

Боюсь, нет плагина, это скорее метод действий, который необходимо внедрить в всю методологию взаимодействия с базой данных.

0 голосов
/ 10 августа 2009

Вам нужно, чтобы он оставался запрашиваемым, или это будет просто для восстановления после неправильных изменений? Если последнее, вы можете просто настроить задание cron для резервного копирования фактических файлов, в которых MySQL хранит данные, и отправки их на сервер контроля версий.

...