База данных: удалять или не удалять записи

117

Я не думаю, что я единственный, кому это интересно. Что вы обычно практикуете в поведении базы данных? Вы предпочитаете физически удалить запись из базы данных? Или лучше просто пометить запись флагом «удалена» или логическим столбцом, чтобы обозначить, что запись активна или неактивна?

jerbersoft
источник
67
... будь благороднее в базе данных терпеть раздувание и избыточность флагов или переносить DELETE в таблицу записей и, удаляя, завершать их. Удалить, уснуть;
nickf 02
7
Привет! Как проголосовать за комментарий?
Nifle 02

Ответы:

48

Это определенно зависит от фактического содержимого вашей базы данных. Если вы используете его для хранения информации о сеансе, тогда непременно сотрите его сразу же, когда сеанс истечет (или будет закрыт), вы не хотите, чтобы этот мусор валялся вокруг. Поскольку он не может быть снова использован для каких-либо практических целей.

В принципе, что вам нужно спросить себя, может мне понадобится восстановить эту информацию? Как и удаленные вопросы в SO, они обязательно должны быть помечены как «удаленные», поскольку мы активно разрешаем восстановление. У нас также есть возможность отображать его для выбора пользователей без особых дополнительных действий.

Если вы активно не стремитесь полностью восстановить данные, но все же хотите сохранить их для мониторинга (или аналогичных) целей. Я бы посоветовал вам разработать (конечно, насколько это возможно) схему агрегации и перенести ее в другую таблицу. Это позволит очистить вашу основную таблицу от «удаленных» данных, а также позволит оптимизировать вторичную таблицу для целей мониторинга (или того, что вы имели в виду).

Для временных данных см: http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/

falstro
источник
30

Плюсы использования флага удаления:

  1. Вы можете получить данные позже, если они вам понадобятся,
  2. Операция удаления (обновление флага), вероятно, быстрее, чем ее удаление

Минусы использования флага удаления:

  1. Очень легко пропустить AND DeletedFlag = 'N'где-то в вашем SQL
  2. Медленнее, чтобы база данных находила интересующие вас строки среди всей ерунды
  3. В конце концов, вы, вероятно, все равно действительно захотите удалить ее (при условии, что ваша система работает успешно. А что насчет того, когда этой записи 10 лет, и она была "удалена" через 4 минуты после первоначального создания)
  4. Это может сделать невозможным использование естественного ключа. У вас может быть одна или несколько удаленных строк с естественным ключом и реальная строка, желающая использовать тот же естественный ключ.
  5. Могут быть юридические причины / причины соответствия, по которым вы действительно хотите удалить данные.
WW.
источник
23

В качестве дополнения ко всем постам ...

Однако, если вы планируете пометить запись, неплохо было бы рассмотреть возможность создания представления для активных записей. Это избавит вас от написания или забывания флага в вашем SQL-запросе. Вы также можете рассмотреть возможность просмотра неактивных записей, если считаете, что это также служит определенной цели.

Адил Ансари
источник
11

Я рад, что нашел эту ветку. Мне тоже было интересно, что люди думают по этому поводу. Я реализовал «помечено как удаленное» около 15 лет во многих системах. Всякий раз, когда пользователь звонил, чтобы сказать, что что-то было случайно удалено, было намного проще пометить это как не удаленное, чем воссоздать или восстановить из резервной копии.

Мы используем postgresql и Ruby на рельсах, похоже, мы могли бы сделать это одним из двух способов: изменить рельсы или добавить триггер ondelete, а вместо этого сделать функцию pl / pgsql, чтобы пометить как удаленные. Я склоняюсь к последнему.

Что касается снижения производительности, будет интересно увидеть результаты EXPLAIN-ANALYZE для больших таблиц для нескольких удаленных элементов, а также для многих удаленных элементов.

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

Но, как кто-то сказал, иногда вам может понадобиться вернуть этот конкретный ключ по какой-то причине, в этот момент вам нужно будет действительно удалить его, а затем заново создать записи (при восстановлении его и изменении записи).

user67403
источник
1
+1, потому что удобство использования включает ограничение моей способности совершать катастрофические ошибки.
Джесси
6

В любом случае, если речь идет о личных данных, возникают юридические проблемы. Я думаю, это во многом зависит от того, где вы находитесь (или где находится база данных) и каковы условия использования.

В некоторых случаях люди могут попросить удалить их из вашей системы, и в этом случае требуется полное удаление (или, по крайней мере, очистка всей личной информации).

Я бы проконсультировался с вашим юридическим отделом, прежде чем вы примете какую-либо стратегию, если речь идет о личной информации.

Джереми Френч
источник
5

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

Роберт Гулд
источник
2

Если вас беспокоят «спящие» записи, замедляющие доступ к базе данных, вы можете переместить эти строки в другую таблицу, действующую как «архивная».

Cruizer
источник
1

Для вводимых пользователем / управляемых данных я использовал описанный вами метод флага и дал пользователю интерфейс «очистить корзину» для фактического удаления элементов, если они захотят.

Abie
источник