【问题标题】:Implementing soft delete实现软删除
【发布时间】:2016-07-08 11:27:05
【问题描述】:

我有 SQL Server 2014,对于大学,我想在我的所有表上实现软删除。

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 添加一列用于软删除。最好的方法是什么?

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

【问题讨论】:

  • 你记得声明外键吗?

标签: sql sql-server-2014 soft-delete


【解决方案1】:

一致性是关键。

无论您在一个表上使用什么字段名称,都尽量使其与其他表保持一致,这在您重构代码并需要将新的 where 子句应用于多行代码时非常有帮助。

使用ALTER TABLE,您可以简单地为deleted 添加一个布尔字段,或者您可以记录更多数据,例如日期/时间甚至用户。尽管如此,一致性是关键。无论您使用什么字段名称,都可以使其在其他表中保持一致。

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

【讨论】:

    【解决方案2】:

    添加字段deleted_time(用户等)并添加触发器以在删除和取消删除记录时填充此字段。在查询的添加条件中,deleted_time 不为空。
    为了在当前数据上获得更好的性能,您可以创建像“Customers_arch”这样的新表并将删除触发器添加到客户,将行从客户插入到 Customers_arch 以及一些附加字段,如日期时间、用户等,然后您不需要更改查询现有的应用程序。

    【讨论】:

      【解决方案3】:

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

      如果您不需要它,请不要这样做。根据您的用途,滚动备份、将记录移动到不同的表或拥有“活动”连接表是更好的设计。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-04
        • 2019-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        相关资源
        最近更新 更多