2009-09-20 4 views
1

Я решил, что вместо того, чтобы удалять строки из базы данных postgres, я скорее спрячу строки так, чтобы в случае, если строки были удалены случайно, я все равно могу их восстановить. Каков наилучший способ скрыть строки из базы данных? Рекомендуете ли вы создать столбец с именем «Активный» и присвоить ему значение 1 или 0, 1 означает «активное», а «0» - удалить и скрыть. Я также использую sqlalchemy, если это имеет значение.Скрыть строки в postgres

ответ

2

Это практически единственный способ сделать это без фактического удаления строк.

Вы можете создать представление, показывающее только активные записи, поэтому вам не нужно забывать добавлять это в предложение where каждого запроса.

2

Вы можете скрыть реальную таблицу, создать представление и использовать правила для вставки, обновления и удаления.

Предположим, у вас есть таблица сеансов. Я бы создал таблицу под названием session_table, которая содержит все данные и «active» -column. Тогда у вас есть вид, называемый сеансом (CREATE view session AS SELECT [все поля withtout active] FROM session_table WHERE active = TRUE), как упоминал Грег.

Теперь вы можете создать правило: Если вы хотите удалить строку в сессии, вы хотите обновить строку в sessions_table вместо:

CREATE RULE delete_session ON DELETE к сеансам DO ВМЕСТО UPDATE sessions_table SET активен = FALSE WHERE id = OLD.id;

Для вставки, вам необходимо:

CREATE RULE insert_session ON INSERT к сеансам DO ВМЕСТО INSERT INTO sessions_table (..., активные) VALUES (..., TRUE);

И, наконец, мы имеем

CREATE RULE update_session ON UPDATE к сеансу DO ВМЕСТО UPDATE sessions_table SET ... WHERE ID = new.id и активный = TRUE;

Теперь вы называете работу полностью сессиями и не должны беспокоиться об активной колонке.

2

Гораздо лучше иметь отметку «ValidBefore», чем флаг.

Предположительно, причина, по которой вы хотите их сохранить, не доверяет вашей логике или пользователям удаления, и вы хотите восстановить строки, удаленные при обнаружении ошибки.

Это намного проще сделать, если у вас есть метка времени или аналогичный, а не только флаг.

+0

Наилучший подход здесь - объединить временную метку ValidBefore с предложениями по выбору и триггерам здесь. –

0

Как насчет наличия таблицы hidden_rows_table, которая имеет ту же структуру, что и активная таблица? Затем вы можете перемещать строки из активной таблицы в hidden_rows_table при их удалении. Чтобы выбрать все строки (как скрытые, так и активные), вы можете использовать UNION.

Это решение особенно хорошо, если у вас есть огромное количество данных, например, в хранилище данных, и вас беспокоит производительность, например, создание новых индексов.

Смежные вопросы