#database-design
#база данных-дизайн
Вопрос:
Я хотел бы узнать о стандартной практике удаления записей из базы данных.
В качестве примера пользователь удалил запись, но мы все равно хотим сохранить журнал удаленной записи и от какого пользователя, чтобы восстановить ее, если произошла ошибка, или узнать, кто внес изменения.
На этой ноте, если этот пользователь покидает компанию, не кажется хорошей идеей полностью удалять его, поскольку есть информация (например, журнал), все еще связанная с этим пользователем. Однако, если мы оставим его и просто не будем отображать его, администратор может не знать, почему конкретное имя пользователя недоступно.
Кроме того, если простое скрытие удаленных записей является стандартной практикой, не приводит ли это к потенциально огромным таблицам с очень редко доступными данными?
Заранее спасибо за вашу помощь.
Комментарии:
1. некоторые данные не следует удалять, но они должны быть помечены как «неактивные». обычно я избегаю удаления учетных записей, а вместо этого их деактивирую. также используйте ограничения в своей базе данных, чтобы избежать несоответствия данных
Ответ №1:
Во многих проектах я не удаляю записи, а помечаю их как удаленные, устанавливая значение true для поля, которое я создал для каждой таблицы.
Так, например, я использую
UPDATE my_table SET deleted = true
WHERE id = ...
Помните, что при запросе допустимых записей необходимо указать
SELECT * FROM your_table
WHERE deleted = false
Комментарии:
1. 1 для удаленных=true. Макрос кажется очень хорошим подходом. Но что, если у вас миллионы записей и постоянно появляются новые, новые и новые записи? Вы не думаете, что это может перегрузить базу данных?
2. Ну, может быть. Добавление индекса к удаленному полю в любом случае поможет вам. Подумайте об этом: если вам нужно сохранить записи, быстрых альтернатив не так много 😉
3. @AwaisQarni: посмотрите на мой предыдущий комментарий; Я забыл уведомить вас, извините
4. @Marco: Это звучит как наиболее осуществимая идея. Проблема возникает из-за того, что некоторые вещи, такие как username, не смогут быть повторно использованы (и должны ли они, если они связаны?). Я полагаю, что это компромисс, который мне нужно сделать.
5. @TheoScholiadis: да, я думаю, это то, что мы должны заплатить, чтобы иметь эту функцию…
Ответ №2:
Во-первых, ваш вопрос на самом деле НЕ является проблемой программирования или, если на то пошло, проблемой проектирования базы данных, это скорее проблема бизнес-потребностей. более того, это открытый вопрос, и поэтому мой ответ может быть субъективным.
Просто чтобы упомянуть последний момент, о котором вы спрашиваете в первую очередь, «потенциально» огромная таблица — это относительное утверждение. Что вы храните для каждого отдельного пользователя? Это ежедневный журнал активности для всей их истории занятости или это номинальные данные сотрудника?
Для важных данных вы можете пометить данные с помощью специального столбца статуса (например, вы можете пометить кого-то как вышедшего на пенсию, уволенного и т.д., а не удалять запись). Вы также можете переместить данные в архивную таблицу или даже в отдельную архивную базу данных с дополнительными полями даты архивирования и т.д. Существует много способов обработки данных.
Современные технологии позволяют нам создавать базы данных, которые могут эффективно хранить пета-байты данных.
Посмотрите на свои организационные потребности и используйте ЭТО в качестве критерия, а не думайте, что а) это проблема дизайна или б) это проблема программирования.
Комментарии:
1. Ты прав, Ахмед. Бизнес-решение принято, и я ищу, как его реализовать. Пример пользователя был самым простым, с которым я сталкивался. Другие примеры включают удаление записи из любой таблицы и сохранение записи о том, что кто-то ее удалил.
Ответ №3:
Если дальнейшее использование невозможно, и вы не можете думать о будущем сохранении записи в базе данных, тогда продолжайте и выполните жесткое удаление, чтобы контролировать размер таблицы. В вашем случае это не так, вы должны решить, нужно ли вести журнал или журнал должен быть сохранен, т. Е. Выполнять ли каскадное удаление или удалять только пользователя, а журнал оставаться сиротой в базе данных.
Как упоминалось выше, добавление логического столбца в таблицу — хорошая идея. Другим подходом может быть использование второй базы данных и перемещение всех записей, удаленных из исходной базы данных, во вторичную базу данных.
Что касается стандартной практики, я не думаю, что она существует, вам нужно найти практику, которая соответствует вашим потребностям и реализации.
Комментарии:
1. Вторая база данных — хорошая идея, но, возможно, непрактичная, поскольку некоторые данные все равно должны появиться в текущей / действующей базе данных. Например. вы удаляете пользователя, но все сделанные им обновления все равно должны оставаться активными. Хотя об этом стоит подумать…