我有一个现有的应用程序(使用MySQL DB)。
我刚刚得到了一个新的要求,我需要从一个主要实体中删除一些记录。我不想在这里应用硬删除,因为它对整个应用程序都有风险。如果我使用软删除,我必须添加另一个字段is_deleted,因此我必须更新所有查询(比如where is_deleted = '0')。
如果有更聪明的方法来处理这种情况,请告诉我。如果我引入一个新的标志来处理删除,我必须在一半的查询中进行更改。
发布于 2012-03-28 14:06:46
您的应用程序无需任何更改即可运行。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'另一种方法是创建触发器,并复制独立表中已擦除的行。
发布于 2012-03-28 14:06:59
四点建议:
is_deleted的位,而是使用名为deleted_Date的dateTime ...如果它仍处于活动状态,则将此值设置为NULL,否则将其设置为删除日期的时间戳。这样,您还可以知道何时更新一半的查询以排除已删除的记录,创建一个执行此筛选的视图,然后更新您的查询以使用此视图,而不是在所有地方应用筛选。之前进行了适当的完整性检查
https://stackoverflow.com/questions/9901905
复制相似问题