【问题标题】:MySql Soft deleteMySql 软删除
【发布时间】:2012-03-28 20:34:17
【问题描述】:

我有一个现有的应用程序(使用 MySQL DB)。

我刚收到一个新要求,我需要从一个主要实体中删除一些记录。我不想在这里应用硬删除,因为它对整个应用程序有风险。如果我使用软删除,我必须添加另一个字段 is_deleted,因此我必须更新我的所有查询(例如 where is_deleted = '0')。

如果有任何更聪明的方法来处理这种情况,请告诉我。如果我引入一个新标志来处理删除,我必须对一半的查询进行更改。

【问题讨论】:

  • 没有其他方法 - 要么是一个新的标志和/或你可以扩展一个现有的标志......
  • 是的,根据您的要求标志是最佳选择,否则您可以将表的摘要放入临时表并对其进行删除以进行检查。
  • 取决于软删除的含义以及应用程序的风险。您可以为“已删除”条目创建一个新表并移动“软删除”。

标签: mysql


【解决方案1】:

您的应用程序无需任何更改即可运行。 MySQL 是 ANSI-SPARC Architecture 兼容的。使用外部模式,您可以实现codd's rule 9 "Logical data independence"

对逻辑级别(表、列、行等)的更改必须 不需要更改基于结构的应用程序。逻辑的 数据独立性比物理数据更难实现 独立。

您可以rename 您的表并使用原始表名创建视图。一个样本:

假设有一个名为my_data的表:

REMAME TABLE my_data TO my_data_flagged

ALTER TABLE my_data_flagged 
   ADD COLUMN is_deleted boolean NOT NULL default 0;

CREATE VIEW my_data AS 
   SELECT * 
   FROM my_data_flagged 
   WHERE  is_deleted = '0'

另一种方法是创建触发器并在独立表中复制已删除的行。

【讨论】:

    【解决方案2】:

    四点建议:

    1. 不要使用名为 is_deleted 的位,而是使用名为 deleted_Date 之类的日期时间...如果它仍然处于活动状态,则将此值设为 NULL,否则为删除日期的时间戳.这样您还可以知道何时删除了特定记录。

    2. 与其更新一半查询以排除已删除的记录,不如创建一个执行此过滤的视图,然后更新您的查询以使用此视图,而不是在任何地方应用过滤。

    3. 如果软删除记录涉及任何类型的关系,您可能必须创建触发器以确保活动记录不能有被标记为已删除的父项。

    4. 提前考虑您最终希望如何硬删除这些软删除的记录,并确保在执行硬删除之前进行适当的完整性检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2011-12-26
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多