Я не думаю, что я единственный, кому это интересно. Что вы обычно практикуете в поведении базы данных? Вы предпочитаете физически удалить запись из базы данных? Или лучше просто пометить запись флагом «удалена» или логическим столбцом, чтобы обозначить, что запись активна или неактивна?
database
database-design
jerbersoft
источник
источник
Ответы:
Это определенно зависит от фактического содержимого вашей базы данных. Если вы используете его для хранения информации о сеансе, тогда непременно сотрите его сразу же, когда сеанс истечет (или будет закрыт), вы не хотите, чтобы этот мусор валялся вокруг. Поскольку он не может быть снова использован для каких-либо практических целей.
В принципе, что вам нужно спросить себя, может мне понадобится восстановить эту информацию? Как и удаленные вопросы в SO, они обязательно должны быть помечены как «удаленные», поскольку мы активно разрешаем восстановление. У нас также есть возможность отображать его для выбора пользователей без особых дополнительных действий.
Если вы активно не стремитесь полностью восстановить данные, но все же хотите сохранить их для мониторинга (или аналогичных) целей. Я бы посоветовал вам разработать (конечно, насколько это возможно) схему агрегации и перенести ее в другую таблицу. Это позволит очистить вашу основную таблицу от «удаленных» данных, а также позволит оптимизировать вторичную таблицу для целей мониторинга (или того, что вы имели в виду).
Для временных данных см: http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/
источник
Плюсы использования флага удаления:
Минусы использования флага удаления:
AND DeletedFlag = 'N'
где-то в вашем SQLисточник
В качестве дополнения ко всем постам ...
Однако, если вы планируете пометить запись, неплохо было бы рассмотреть возможность создания представления для активных записей. Это избавит вас от написания или забывания флага в вашем SQL-запросе. Вы также можете рассмотреть возможность просмотра неактивных записей, если считаете, что это также служит определенной цели.
источник
Я рад, что нашел эту ветку. Мне тоже было интересно, что люди думают по этому поводу. Я реализовал «помечено как удаленное» около 15 лет во многих системах. Всякий раз, когда пользователь звонил, чтобы сказать, что что-то было случайно удалено, было намного проще пометить это как не удаленное, чем воссоздать или восстановить из резервной копии.
Мы используем postgresql и Ruby на рельсах, похоже, мы могли бы сделать это одним из двух способов: изменить рельсы или добавить триггер ondelete, а вместо этого сделать функцию pl / pgsql, чтобы пометить как удаленные. Я склоняюсь к последнему.
Что касается снижения производительности, будет интересно увидеть результаты EXPLAIN-ANALYZE для больших таблиц для нескольких удаленных элементов, а также для многих удаленных элементов.
В системах, которые я обнаружил в течение долгого времени, новые пользователи, как правило, совершают глупые поступки, например, случайно удаляют объекты. Поэтому, когда люди новички в должности, они имеют все права доступа человека, ранее занимавшего эту должность, за исключением нулевого опыта. Случайное удаление чего-либо и возможность быстрого восстановления заставляет всех быстро вернуться к работе.
Но, как кто-то сказал, иногда вам может понадобиться вернуть этот конкретный ключ по какой-то причине, в этот момент вам нужно будет действительно удалить его, а затем заново создать записи (при восстановлении его и изменении записи).
источник
В любом случае, если речь идет о личных данных, возникают юридические проблемы. Я думаю, это во многом зависит от того, где вы находитесь (или где находится база данных) и каковы условия использования.
В некоторых случаях люди могут попросить удалить их из вашей системы, и в этом случае требуется полное удаление (или, по крайней мере, очистка всей личной информации).
Я бы проконсультировался с вашим юридическим отделом, прежде чем вы примете какую-либо стратегию, если речь идет о личной информации.
источник
Я помечаю их как удаленные и на самом деле не удаляю. Однако время от времени я вычищаю весь мусор и архивирую его, чтобы не убивать производительность.
источник
Если вас беспокоят «спящие» записи, замедляющие доступ к базе данных, вы можете переместить эти строки в другую таблицу, действующую как «архивная».
источник
Для вводимых пользователем / управляемых данных я использовал описанный вами метод флага и дал пользователю интерфейс «очистить корзину» для фактического удаления элементов, если они захотят.
источник