Скрыть строки в postgres - PullRequest
       34

Скрыть строки в postgres

1 голос
/ 20 сентября 2009

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

Ответы [ 4 ]

2 голосов
/ 21 сентября 2009

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

Предположим, у вас есть сеансовый стол. Я хотел бы создать таблицу с именем session_table, которая содержит все данные и столбец «active». Затем у вас есть представление, называемое сеансом (СОЗДАЙТЕ сеансы представления, КАК ВЫБРАТЬ [все поля без активного] FROM session_table WHERE active = TRUE), как упомянуто Грегом.

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

СОЗДАТЬ ПРАВИЛО delete_session ON УДАЛИТЬ ДЛЯ СЕССИЙ, УСТАНАВЛИВАТЬ ОБНОВЛЕНИЕ session_table SET active = FALSE WHERE id = OLD.id;

Для вставки вам понадобится:

СОЗДАТЬ ПРАВИЛО insert_session ВКЛЮЧИТЬ В СЕССИИ ВСТАВЛЯТЬ ВСТАВИТЬ В СЕССЫ_таблицы (..., активные) ЗНАЧЕНИЯ (..., ИСТИНА);

И, наконец, у нас есть

СОЗДАЙТЕ ПРАВИЛО update_session ВКЛЮЧЕНО ОБНОВЛЕНИЕ К СЕССИИ, УСТАНАВЛИВАЙТЕ ОБНОВЛЕНИЕ session_table SET ... WHERE id = new.id И active = TRUE;

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

2 голосов
/ 21 сентября 2009

Гораздо лучше иметь временную метку "ValidBefore", чем флаг.

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

Это гораздо проще сделать, если у вас есть временная метка или подобное, а не просто флаг.

2 голосов
/ 20 сентября 2009

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

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

0 голосов
/ 27 сентября 2009

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

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

...