2

MySQL テーブルのすべての行のすべての列へのすべての変更のタイムスタンプ付きレコードを保持する方法はありますか? このようにして、データを失うことはなく、遷移の履歴を保持します。行の削除は、「削除された」列を true に設定するだけである可能性がありますが、回復可能です。

Google のBigTableのオープン ソース実装であるHyperTableを見ていましたが、この機能には本当に驚きました。私のアプリは、HyperTable の展開を正当化するほどの膨大な量のデータを処理しないため、MySQL にそれを含めることができれば素晴らしいことです。この仕組みの詳細については、こちらをご覧ください

この 1 つの機能だけを MySQL に追加する構成、プラグイン、フォークなどはありますか?

4

4 に答える 4

3

私は過去にカオスが説明したものと同様のphpモデルでこれを実装しました。

mysql 5 を使用している場合は、テーブルの on update および on delete イベントにフックするストアド プロシージャを使用してこれを達成することもできます。

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

于 2009-08-10T01:43:00.470 に答える
2

これはカスタム フレームワークで行います。各テーブル定義は、メイン テーブルと多対 1 で関連付けられたログ テーブルも生成し、フレームワークがメイン テーブルの行を更新すると、行の現在の状態がログ テーブルに挿入されます。したがって、テーブルの状態に関する完全な監査証跡があります。(すべてのテーブルに LoggedAt 列があるため、時間レコードがあります。)

残念ながら、プラグインではなく、データベースとのやり取りの方法論全体に組み込む必要があることを行う方法です。

于 2009-08-10T01:35:55.923 に答える
2

次の情報を格納するテーブルを作成します...

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 番目のログ テーブルの必要性を回避します (そして、スキーマが変更されたときに同期を維持します) が、新しいレコードを作成するときに追加の結合とオーバーヘッドが発生します。

于 2009-08-10T01:40:03.953 に答える
0

クエリ可能のままにする必要がありますか?それとも、不適切な編集から回復するためだけですか? 後者の場合は、cron ジョブをセットアップして、MySQL がデータを格納する実際のファイルをバックアップし、それをバージョン管理サーバーに送信できます。

于 2009-08-10T01:50:02.753 に答える