我已经决定不是从postgres数据库中删除行,而是隐藏行,以便在意外删除行的情况下,我仍然可以检索它们。从数据库中隐藏行的最佳方法是什么?您是否建议创建名为“Active”的列,并为其赋值1或0,1表示活动,0表示删除和隐藏。如果重要的话我也会使用sqlalchemy。
答案 0 :(得分:2)
在没有实际删除行的情况下,这几乎是唯一的方法。
您可以创建一个仅显示活动条目的视图,因此您不必记住将其添加到每个查询的where子句中。
答案 1 :(得分:2)
您可以隐藏真实表格,创建视图并使用规则进行插入,更新和删除。
假设您有一个会话表。我将创建一个名为sessions_table的表,其中包含所有数据和“活动”列。然后你有一个名为session的视图(CREATE视图会话AS SELECT [所有字段都没有激活] FROM sessions_table WHERE active = TRUE),如Greg所述。
现在您可以创建规则:如果要删除会话中的行,则需要更新sessions_table中的行:
CREATE RULE delete_session ON DELETE TO sessions DO INSTEAD UPDATE sessions_table SET active = FALSE WHERE id = OLD.id;
要插入,您需要:
CREATE RULE insert_session ON INSERT TO sessions DO INSTEAD INSERT INTO sessions_table(...,active)VALUES(...,TRUE);
最后我们有
CREATE RULE update_session ON UPDATE TO session DO INSTEAD UPDATE sessions_table SET ... WHERE id = new.id AND active = TRUE;
现在,您可以完全通过会话调用工作,而不必费心使用活动列。
答案 2 :(得分:2)
拥有“ValidBefore”时间戳而非标志要好得多。
大概你想要保存它们的原因是你不相信你的删除逻辑或用户,并且, 您希望能够恢复发现错误时删除的行。
如果你有一个时间戳或类似的东西,而不仅仅是一个标志,这就容易多了。
答案 3 :(得分:0)
如何使hidden_rows_table与活动表具有完全相同的结构?然后,您可以在删除行时将活动表中的行移动到hidden_rows_table。要选择所有行(隐藏和活动),您可以使用UNION。
如果您拥有大量数据,例如在数据仓库中,并且您担心例如创建新索引的性能,则此解决方案尤其有用。