字体:  

大家如果设计数据的“删除”问题?

peacock 发表于: 2008-8-26 22:03 来源: PHPChina 开源社区门户

很多系统应用中,数据是不能直接删除的,一是为了数据的关联性,二是为了数据的安全性。
本人在设计数据的删除操作的时候,采用了如下的方法:
1、假设数据存在关联性,数据不能删除,并提示不能删除的原因。这种方法开销比较大,需要进行所有关联数据表的信息查询。
比如表B的字段1与表A的字段1关联,当删除表A的记录时,先检查表B是否存在与该记录相关的记录,如果存在,则不能删除表A的这条记录

2、假设数据不存在关联,则将该条记录标志为已删除,通过一个字段来标识记录是否删除,实际上并没有被删除。这样做的目的是为了防止数据被恶意删除,或者在以后有用的时候再进行恢复。
这种方法的最大问题是当增加或者修改别的信息的时候,如果关键字与被删除的信息相同时,会发生冲突,这样就必须对被删除的信息进行处理,是覆盖被删除的信息然后恢复还是修改被删除信息的关键信息,这都是比较麻烦的事情。

大家对“删除”操作有什么高见,敬请发表各自的意见。

最新回复

E网逍遥 at 2008-8-28 01:39:26
那你就再建一个字段来判断,类似回收站功能,真正删除的时候类似清空回收站,这个应该不难吧
peacock at 2008-8-29 09:17:54
其实我觉得有2个难点:
1、关联性的检查
2、新增和修改的信息与被删除信息关键字相同的处理
七月十五 at 2008-8-29 09:58:44
1、可以用InnoDB的外键支持,由数据库内部实现关联统一删除,或有关联不得删除,还可以用触发器。可惜MySQL用MyIASM太久了,很多高级的SQL操作都让MyIASM给埋没了。

2、一般来说删除某条记录,只需要将此记录标记为“已删除”即可。因为在一段时间内,这条记录还可能关联到很多其它的表的记录。如论坛的“回收站”。

3、确实需要物理删除才用到DELETE,如论坛的“清空回收站”。
spiritxia at 2008-8-29 10:01:29
innodb 和myiasm 的速度性能差异太大啊