我决定与其从 postgres 数据库中删除行,不如隐藏这些行,以便万一这些行被意外删除,我仍然可以检索它们。从数据库中隐藏行的最佳方法是什么?您是否建议创建一个名为“Active”的列并为其赋值 1 或 0,1 表示活动,0 表示已删除和隐藏。如果这很重要,我也在使用 sqlalchemy。
4 回答
您可以隐藏真实表,创建视图并使用规则进行插入、更新和删除。
假设您有一个会话表。我将创建一个名为 sessions_table 的表,其中包含所有数据和“活动”列。然后你有一个名为 session 的视图(CREATE view sessions AS SELECT [all fields withouttout active] FROM sessions_table WHERE active = TRUE),正如 Greg 所提到的。
现在你可以创建一个规则:如果你想删除会话中的一行,你想更新 session_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;
现在您完全可以在会话上调用工作,而不必为活动列而烦恼。
有一个“ValidBefore”时间戳比一个标志要好得多。
您想保存它们的原因可能是您不信任您的删除逻辑或用户,并且您希望能够在发现错误时恢复已删除的行。
如果你有一个时间戳或类似的东西而不仅仅是一个标志,这会更容易做到。
这几乎是不实际删除行的唯一方法。
您可以创建一个仅显示活动条目的视图,因此您不必记住将其添加到每个查询的 where 子句中。
拥有一个与活动表具有完全相同结构的 hidden_rows_table 怎么样?然后,您可以在删除它们时将行从活动表移动到 hidden_rows_table。要选择所有行(隐藏的和活动的),您可以使用 UNION。
如果您有大量数据(例如在数据仓库中)并且您担心创建新索引等性能,则此解决方案特别好。