Rss & SiteMap
Foxtable(狐表) http://www.foxtable.com
关于伪删除的一些看法
做程序的时候,大家主要的动作是增删改,在这其中再加上处理逻辑关系.于是很多时候我们会遇到这样的问题.
比如,我们需要删除一行数据的时候,但这行数据有很多子项,有些人是在数据库中不建立表的主外键关系,有些人是先删除所有子项,再删除我们所想删除的数据.
对于第一种,不建立表主外键关系的处理方法,是最不好的一种处理方法,因为以后,你的所有子项会在子表中累积很多,并且表的数据结构体现的也不完整.
而对于第二种,的确节省了很多空间,但遇到有些问题的时候,比如有很多订单,都购买的是同一种商品,而商品的信息又是通过外键链接ID查看的.这个时候,如果伤处了商品的信息,那么,其对应的所有订单的信息也同样被删除一空,这样肯定是不可取的.
那么下面我们来说说第三种方法,伪删除.
其实伪删除的原理非常简单,就是我们在数据库中,对于所有的表,都有这样一列,比如 列名:YN,数据类型:bit,默认值:True
这一列的作用就是表明此行数据是否在数据库中存在,所有存在的数据,YN列的值都为True,如果你要删除某一行的话,你将此行的YN列改为Falsh则标明为已经删除,但是这样还是会产生很多的不必要的信息存放在数据库中,所以,我们需要对数据库提供一个批量清理YN列为Falsh的数据,并整理其中的逻辑结构的方法,然后定期的,或者指定的时间调用它.
伪删除的好处有以下几点
1,可以在数据库中建立完整的数据结构
2,不用再用户执行具体操作的时候,为整理完善数据结构花费大量的时间和性能.
3,数据删除后还能在一定范围内,起到它应该承担的任务.比如连接查看一些基本信息的时候,不会导致删除后的数据不完整.
4,可以修复错误的操作.
我发现很多人都没有使用伪删除,我已经用了很久了,在这里简单的给大家分享一下
有利毕有弊,要看客户对这方面的需求如何。
如果碰到极度不信任的人,需要记录删除记录一定时间。防止恶意删除等要求。
我想,伪删除应该能解决吧。
自己添加一个字段 IsDelete,然后修改自己的SQL语句就可以了。不需要Foxtable额外的支持。
如果让Foxtable内嵌无数特殊功能,他会越来越臃肿。
比如需要支持插入行,内部表增加了一个隐藏列。 需要支持锁定,内部表增加了一个隐藏列。 现在需要增加伪删除,又要增加一个隐藏列。
这样下去,内部表就有一大堆隐藏列,这对不需要这些功能的用户来说是不公平的。
即使有些用户需要这个功能,但也不是每个表都需要这些隐藏列。
自己添加一个字段 IsDelete,然后修改自己的SQL语句就可以了。不需要Foxtable额外的支持。
如果让Foxtable内嵌无数特殊功能,他会越来越臃肿。
比如需要支持插入行,内部表增加了一个隐藏列。 需要支持锁定,内部表增加了一个隐藏列。 现在需要增加伪删除,又要增加一个隐藏列。
这样下去,内部表就有一大堆隐藏列,这对不需要这些功能的用户来说是不公平的。
即使有些用户需要这个功能,但也不是每个表都需要这些隐藏列。
有道理
自己添加一个字段 IsDelete,然后修改自己的SQL语句就可以了。不需要Foxtable额外的支持。
如果让Foxtable内嵌无数特殊功能,他会越来越臃肿。
比如需要支持插入行,内部表增加了一个隐藏列。 需要支持锁定,内部表增加了一个隐藏列。 现在需要增加伪删除,又要增加一个隐藏列。
这样下去,内部表就有一大堆隐藏列,这对不需要这些功能的用户来说是不公平的。
即使有些用户需要这个功能,但也不是每个表都需要这些隐藏列。
如果利用这种机制实现伪删除显然是不经济的
在现在的系统里,要删除一条数据,只需要Tables("表名").Current.Delete
然而伪删除的代码几何呢?
作为一个二次开发平台,foxtable,在数据处理方面已经很优秀了。
但,作为一个使用者,二次开发者来讲,是远远不够的。
讨论伪删除的目的在于,该功能,大多数用户是否需要,需要又如何实现。
毕竟一个发展阶段的二次开发平台,不应该为不受欢迎的功能做出妥协。
如果就按一楼的做法,伪删除就是过滤掉标识列YN=False的列,在目前的FoxTable中就要适时地重新加载这个表
大家看看是否愿意这样。
不单单只是删除、与加载的问题,还有更深层的问题,唯一约束。又该如何。
我目前考虑的是采用日期字段来作为删除字段。
空内容为正常,删除、停用时获取前日期时间,防止重复。使唯一约束能正常