什么是软删除和硬删除
软删除
软删除,也称为逻辑删除或标记删除,并不是真正的从数据库中删除数据,而是通过设置一个字段(如isDelete或state)来标记删除状态。当该字段为0时,表示数据未被删除;当该字段为1时,表示数据已被删除。这种删除方式的优势在于数据可恢复性较高,只需要根据标记进行恢复即可。
软删除的优点:
数据恢复:软删除可以保留被删除数据的备份,方便在需要时进行数据恢复。
历史记录:软删除可以保留删除操作的历史记录,有助于审计和追踪数据的变化。
数据完整性:软删除可以保持数据表的完整性约束,避免因删除操作破坏关联关系或约束条件。
软删除的缺点:
索引和约束:软删除需要处理索引和约束条件的问题,确保查询和更新操作的正确性和性能。
存储空间:软删除会占用额外的存储空间,因为被删除的数据仍然存在于数据库中。
标记删除的无效数据太多,影响数据库存储速度。
占用有效的磁盘空间。
硬删除
硬删除,也称为物理删除,是直接从数据库中移除数据。例如,当用户执行某个删除操作时,数据库会执行相应的delete操作。使用这种删除方式的话,数据是不可恢复的,如果一定要恢复的话,只能通过日志。
硬删除的优点:
简单快速:硬删除操作简单,速度快,适用于大量数据的快速清除。
不占用额外空间:硬删除不会保留被删除数据的备份,因此不会占用额外的存储空间。
硬删除的缺点:
数据恢复困难:硬删除后,被删除的数据很难恢复,甚至可能无法恢复。
可能破坏数据完整性:硬删除可能会导致数据完整性约束被破坏,关联关系或约束条件可能会受到影响。
软删除的实现
新建模型对象,我们可以给数据库增加一个状态字段:status
对status字段进行增强
model示例
@Data
public class Vendor extends BaseModel {
/** 唯一编号 */
private Integer id ;
/** 供应商名称 */
private String name ;
/** 图片地址 */
private String img ;
/** 排序 */
private Integer seq =1;
/** 详细说明 */
private String brief ;
/** 状态 */
private Integer status=1 ;
/**status的增强数属性,数据库不存在该字段**/
private String statusX;
/**对status的增强方法 **/
public String getStatusX() {
VendorStatus vendorStatus=VendorStatus.findByCode(this.status);
if (vendorStatus!=null){
return vendorStatus.getDesc();
}
return "未定义";
}
/** 省份 */
private String province ;
/** 城市 */
private String city ;
/** 区域 */
private String county ;
/** 具体地址 */
private String address ;
}
新建一个枚举类型
public enum VendorStatus {
SALED(1, "正常"),
SELLING(0, "注销");
@Getter@Setter
private Integer code;
@Getter@Setter
private String desc;
VendorStatus(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public static VendorStatus findByCode(Integer code) {
Optional<VendorStatus> first = Arrays.stream(VendorStatus.values()).filter(item -> item.getCode().equals(code)).findFirst();
return first.orElse(null);
}
}