实现软删除

Implementing soft delete

我有 SQL Server 2014,为了上大学,我想在所有 table 上实施软删除。

SET DATEFORMAT dmy

CREATE TABLE Customers
(
    CustomerId int IDENTITY (1,1) not null,
    FirstName varchar (20) not null,
    LastName varchar (30) not null,
    Address1 varchar (30) not null,
    Address2 varchar (30) not null,
    Address3 varchar (30) null,
    Eircode varchar (8) null,
    DateOfBirth date not null,
    CountyId int not null,
    CountryId int not null,
    AssociationId int null,
    CustomerTypeId int not null,
    AccountId int not null
)

我想使用 deleted at 添加一个用于软删除的列。执行此操作的最佳方法是什么?

是否建议您对数据库中的所有 table 使用软删除 (deleted_at) 以保持一致。

添加字段 deleted_time(用户等)并添加触发器以在删除和取消删除记录时填充此字段。在查询的添加条件中 deleted_time 不为空。
为了在当前数据上获得更好的性能,您可以创建新的 table,例如 "Customers_arch",并添加删除触发器到客户,以将客户的行插入到 Customers_arch 以及一些额外的字段,例如 date_time ,用户等,那么您不需要更改现有应用程序的查询。

一致性是关键。

无论您在一个 table 上使用什么字段名称,也请尽量使其他 table 保持一致,当您重构代码并需要应用新的 where 子句时,这将大有帮助很多行代码。

使用 ALTER TABLE 您可以简单地为 deleted 添加一个布尔字段,或者您可以记录更多数据,例如 date/time 甚至用户。不过,一致性是关键。无论您使用什么字段名称,都要在其他 table 中保持一致。

然后可以创建触发器更新删除字段信息,也可以从触发器中取消删除。字段名称的一致性将对您有很大帮助。

软删除增加了数据设计和查询的复杂性。现在每个查询都必须记住检查 deleted_at。每个连接还必须检查 deleted_at。人们可能会忘记这一点。

不需要就不要做。根据您的用途,滚动备份、将记录移动到不同的 table 或 "active" 加入 table 是更好的设计。

作为后者的一个例子,你有一个像这样的连接 table:

CREATE TABLE active_customers (
    CustomerID INT REFERENCES Customers(CustomerId)
);

这可能看起来多余,但它使关系更简单。现在有一个明确的方法来确定谁是活跃的,谁不是,查询active_customers并加入customers。可以将触发器添加到 active_customers 以在激活或停用客户时更新其他 table。需要活跃客户的关系可以与 active_customers 关联,避免必须限定您的加入。