База данных: удаление или удаление записей

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Недостатки использования флага удаления:

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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