我有一个现有的应用程序(使用MySQL DB)。
我刚刚获得了一项新要求,我需要从主要实体中删除一些记录。我不想在这里应用硬删除作为整个应用程序的风险。如果我使用软删除,我必须添加另一个字段is_deleted,因为我必须更新我的所有查询(例如is_deleted ='0')。
如果有更聪明的方法来处理这种情况,请告诉我。如果我引入一个新标志来处理删除,我必须对一半查询进行更改。
答案 0 :(得分:5)
您的应用程序无需任何更改即可运行。 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'
另一种方法是创建一个触发器并在独立表中复制已删除的行。
答案 1 :(得分:4)
四点建议:
不使用名为is_deleted
的位,而是使用名为deleted_Date
之类的日期时间...如果该值仍然有效,则此值为NULL
,并且为否则,删除日期的时间戳。通过这种方式,您还可以在删除特定记录时知道
不是更新一半查询以排除已删除的记录,而是创建一个执行此过滤的视图,然后更新您的查询以使用此视图,而不是在任何地方应用过滤。
如果软删除的记录涉及任何类型的关系,您可能必须创建触发器以确保活动记录不能将父标记为已标记为已删除。
提前考虑如何最终硬删除这些软删除的记录,并确保在执行硬删除之前已经进行了适当的完整性检查。