在大型关系数据库中实现软删除的最佳方法是什么?

时间:2015-06-07 20:58:49

标签: sql-server database sql-server-2012

使用SQL Server 2012,包含200多个表。 我需要实现软删除,这样我才能让我的用户能够“恢复或取消删除”删除的记录。 用户删除记录的表是用户定义的,具有可变数量的关系(外键)到其他表。

到目前为止我见过两种方法:

  1. 所有表格上的IsDeleted列
  2. 拥有镜像归档表
  3. 但是这两种方法似乎在独立表上运行良好,当涉及到具有关系的表时,我认为这两种方法都不实用。

    方法1 :使查询复杂化,导致查询结果不正确。

    SELECT Id,Name FROM User
    Left Join Group ON Group.Id = User.GroupId AND Group.IsDeleted=0
    WHERE User.IsDeleted=0 AND ISNULL(Group.IsActive,0) <> 0
    

    由于连接表IsDeleted过滤器,上面的查询返回无效结果。在其他帖子中,建议IsDeleted = 0就足够了,但正如我在上面演示的那样并非如此。

    SELECT Id,Name FROM User
    Left Join Group ON Group.Id = User.GroupId
    WHERE User.IsDeleted=0 AND Group.IsDeleted=0
    

    以上查询也会在某些情况下无法正常运行,具体取决于用户如何过滤记录(当有更多联接时出现问题)。 在下面的例子中:   用户具有GroupId字段(查找到组)   用户具有RoleId字段(查找角色)   角色具有GroupId字段(查找到组)

    SELECT Id,Name FROM User
    LEFT JOIN Group ON Group.Id = User.GroupId
    LEFT JOIN Role ON Role.Id = User.RoleId
    WHERE User.IsDeleted=0 AND Group.IsDeleted=0 AND Role.IsDeleted=0
    AND /* ...user defined filters...*/ Role.Name is not null
    

    如果删除了组,上面的查询也不会返回正确的结果,但不会返回与该组相关的角色,角色记录也会被过滤掉。

    (我知道有一些方法可以根据具体情况修复查询,但这对我的用例不起作用,我需要一个可靠的预定义模式来应用于所有生成的查询 - 数据库查询未预定义它们是在飞行中生成的。)

    方法2 :非常难以实现,在删除和存档记录时,需要弄清楚其他表中的其他记录是否引用它并以某种方式跟踪它们以便能够当记录未删除时更新它们。

    任何人都有建议在关系数据库中有效实施软删除的最佳方法是什么?

0 个答案:

没有答案