0

我想在我的网站上实现一个主持人功能,我想知道“发送到垃圾箱”数据的最佳做法是什么。我想对用户、图片、评论等进行审核。问题是,如果其中一位版主发疯并开始删除随机内容,我可以轻松恢复数据。

我正在考虑复制所有表,例如表用户,复制到 users_trash,当有人删除用户时,我将确切的行复制到 users_trash。然后,当我想恢复用户时,我只需将该行移回主表。它看起来像一个有效的解决方案,但它是最佳实践吗?

请告诉我您正在考虑的其他建议。

PS:我的网站使用 MySQL 和 PHP。

PS2:我不想在我的表中添加一个新列,比如“可见”,因为我有数百万行,而我的查询的另一个条件只会使它们变慢,并且有很多地方需要修改:)

谢谢

4

2 回答 2

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 回答
1

创建重复的表不是要走的路……您将极大地增加数据库的大小。

相反,创建一个名为“trash”的新表或类似的东西,并具有以下结构:

提议的结构

id        date       table        data
int       DATETIME   VARCHAR      TEXT

当从网站上删除项目时,在垃圾表中创建一个新行,其中“表”是删除记录的表的名称,“数据”应包含已删除数据的序列化数组。

恢复程序

创建一个 php 脚本,通过重新插入“表”列中的行,将“数据”字段反序列化为已删除数据的来源,从而从该表中恢复项目。

Bob 是你的叔叔,你有一种快速的方法可以从任何表中恢复东西,而不会有几十个(或更多)重复。

示例记录

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

users此示例已于 2013 年 1 月 1 日从id = 1234 且名称 = bob的表中删除。

于 2013-05-08T12:56:48.910 回答