0

ウェブサイトにモデレーター機能を実装したいのですが、データを「ごみ箱に送る」ためのベスト プラクティスは何でしょうか。ユーザー、写真、コメントなどをモデレートしたいのですが、問題は、モデレーターの 1 人が気が狂ってランダムなものを削除し始めた場合に、データを簡単に復元できることです。

テーブルユーザーのように、すべてのテーブルを複製してusers_trashに複製することを考えていました。誰かがユーザーを削除すると、正確な行がusers_trashに複製されます。次に、ユーザーを復元したいときは、行をメインテーブルに戻します。効率的なソリューションのように見えますが、ベストプラクティスですか?

他に考えている案を教えてください。

PS: ウェブサイトに MySQL と PHP を使用しています。

PS2: 何百万もの行があり、クエリの別の条件により、行がゆっくりになり、変更する場所がたくさんあるため、「表示」のような新しい列をテーブルに追加したくありません:)

ありがとうございました

4

2 に答える 2

1

重複するテーブルを作成することは適切ではありません...データベースのサイズを大幅に増やすことになります。

代わりに、「trash」などと呼ばれる新しいテーブルを作成し、次の構造を持ちます。

提案された構造

id        date       table        data
int       DATETIME   VARCHAR      TEXT

アイテムが Web サイトから削除されたら、ゴミ箱テーブルに新しい行を作成します。「テーブル」はレコードが削除されるテーブルの名前であり、「データ」には削除されたデータのシリアル化された配列が含まれている必要があります。

復元手順

「テーブル」列から行を再挿入し、削除されたデータのソースとして「データ」フィールドを逆シリアル化して、このテーブルから項目を復元する php スクリプトを作成します。

ボブはあなたの叔父さんです。何十個 (またはそれ以上) の重複を持たずに、任意のテーブルから物事を復元する簡単な方法があります。

記録例

1    01-01-2013 12:00:00    users    a:2:{s:2:"id";i:1234;s:4:"name";s:3:"bob";}

usersこの例は、ID = 1234、名前 = bobのテーブルから 2013 年 1 月 1 日に削除されました。

于 2013-05-08T12:56:48.910 に答える
1

これを必要とするほどディスク容量が問題ではなく、悪意のある UPDATE コマンドの後に復元したい場合は、トリガーを作成して、元のテーブルからのすべての後続の変更を別のテーブルに保存することができます。ただし、これによりテーブルの各リビジョンのエントリが保存されることに注意してください。

次のようになります。

CREATE TABLE rev_users
(
   id INTEGER NOT NULL,
   username VARCHAR(45),
   picLink VARCHAR(45),
   revId INTEGER NOT NULL AUTO_INCREMENT,
   action CHAR(6) NOT NULL,
   PRIMARY KEY(revId)
);
CREATE TRIGGER rev_users_i AFTER INSERT ON users FOR EACH ROW BEGIN 
  INSERT INTO rev_users (id, username, picLink, action)
  VALUES (NEW.id, NEW.username, NEW.picLink, 'INSERT');
END;

CREATE TRIGGER rev_users_u AFTER UPDATE ON users FOR EACH ROW BEGIN 
  INSERT INTO rev_users (id, username, picLink, action)
  VALUES (NEW.id, NEW.username, NEW.picLink, 'UPDATE');
END;

CREATE TRIGGER rev_users_d BEFORE DELETE ON users FOR EACH ROW BEGIN 
  INSERT INTO rev_users (id, username, picLink, action)
  VALUES (OLD.id, OLD.username, OLD.picLink, 'DELETE');
END;
于 2013-05-08T13:00:57.050 に答える