我想在我的网站上实现一个主持人功能,我想知道“发送到垃圾箱”数据的最佳做法是什么。我想调节用户,图片,评论等问题。如果主持人之一变得疯狂并开始删除随机内容,我可以轻松恢复数据。
我在考虑复制所有表,例如表用户,复制到users_trash,当有人删除用户时,我将确切的行复制到users_trash。然后,当我想要恢复用户时,我只需将行移回主表。它看起来像一个有效的解决方案,但它是最好的做法吗?
请告诉我您正在考虑的其他建议。
PS:我在我的网站上使用MySQL和PHP。
PS2:我不想在我的表中添加一个新列,如“可见”,因为我有数百万行,而我的查询的另一个条件只会让它们变慢,并且有很多地方需要修改:)
谢谢
答案 0 :(得分:1)
创建重复的表不是一种方法......你将大大增加数据库的大小。
相反,创建一个名为“trash”的新表或类似的东西,并具有以下结构:
建议的结构
id date table data
int DATETIME VARCHAR TEXT
当从网站删除项目时,在垃圾表中创建一个新行,其中'table'是删除记录的表的名称,'data'应包含已删除的数据的序列化数组
恢复程序
创建一个php脚本,通过重新插入“表格”列中的行,将“数据”字段反序列化为删除数据的来源,从此表中还原项目。
鲍勃是你的叔叔,你可以快速地从任何一张桌子上恢复东西而不需要几十个(或更多)重复。示例记录
1 01-01-2013 12:00:00 users a:2:{s:2:"id";i:1234;s:4:"name";s:3:"bob";}
此示例于01-01-2013从users
表中删除,ID = 1234且名称= bob。
答案 1 :(得分:1)
如果磁盘空间不是需要这个问题,并且您还希望在恶意UPDATE命令之后进行恢复,那么您可以执行的操作是创建触发器以将原始表中的所有后续更改保存到单独的表中。但请注意,这将在您的桌面上保存EACH修订的条目。
它看起来像这样:
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;