Должны ли мы когда-либо удалять данные в базе данных?

40

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

Это правда? Если да, то как крупная компания, такая как IBM, будет обрабатывать свои данные в течение ста и более лет?

fuddin
источник
2
Пожалуйста, уточните - вы спрашиваете, следует ли вам вводить команды удаления в SQL, или вы спрашиваете, действительно ли базовый механизм базы данных удаляет данные, помеченные как удаленные?
GrandmasterB
4
@StartupCrazy: этот комментарий ничего не проясняет для меня.
Док Браун
6
Кто подразумевается под «мы»?
Динамичный
3
Мне очень нравится держать все почти одержимо. Но я не знаю, в каком бизнесе вы работаете, но некоторые данные, которые вы по закону обязаны хранить в течение определенного количества времени, и некоторые данные, которые вы по закону должны удалять через некоторое время.
Питер Б
6
Зависит от того, что это за данные. В некоторых случаях вы должны удалить его по юридическим причинам.
CodesInChaos

Ответы:

64

Как и во всех этих вещах, ответ «это зависит».

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

Однако, если удаленные данные старше определенного периода времени (например, год), вы можете решить действительно удалить их из оперативных таблиц, но сохранить их либо в архивной таблице, либо даже просто в резервной копии, если пользователь когда-либо захочет его обратно. Таким образом, вы можете свести к минимуму объем данных (живых и недавно удаленных).

Однако, если данные эфемерны или легко восстанавливаются, вы можете решить действительно удалить данные.

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

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

ChrisF
источник
8
Некоторые области применения (учет, медицинские устройства), вероятно, требуют, чтобы данные не удалялись из-за требований аудита.
Пол
3
При определенных обстоятельствах вы ДОЛЖНЫ удалить данные, например, относящиеся к личной информации пользователей. Закон ЕС (и, возможно, другие) гласит, что пользователь должен иметь право требовать удаления своих данных. В таком случае эти данные должны быть удалены, а не просто помечены как неактивные. Последнее будет нарушением законов о конфиденциальности.
Гэвин Коутс
освобождает ли некоторое пространство в базе данных увеличение ее производительности?
viveksinghggits
17

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

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

TMN
источник
1
«Нет никакого способа точно определить, какие данные на самом деле используются», - я бы не согласился. Битовое поле «IsDeleted» в каждой таблице - это довольно простой способ определить, что запись больше не актуальна. Большинство вопросов, которые он ставит, таких как каскадное удаление, также присутствуют в физических схемах удаления, и ответы зависят от модели данных и от того, больше ли вы цените размер или производительность хранилища.
KeithS
Это то, что я говорил, системы должны быть разработаны с каким-то индикатором срока годности. В отсутствие этих индикаторов (как в случае многих компаний) невозможно определить, какие записи можно безопасно удалить.
TMN
12

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

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

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

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

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

Что еще хуже, что произойдет, если вы удалите принтер 13 и перетасуете все принтеры, которые идут за ним, чтобы заполнить пробел? Принтер 14 (некоторая дряхлая старая точечная матрица) становится принтером 13, принтер 15 становится принтером 14 и так далее.

На всех принтерах есть ярлыки, так что они могут иметь перекрестные ссылки с базой данных, но теперь все ярлыки устарели. Вам придется обойти, найти каждый принтер в бизнесе (который может исчисляться сотнями!) И перемаркировать их. Это вряд ли эффективное использование времени. И это также подверженный ошибкам процесс, и что произойдет, если это просто никогда не будет сделано? Кто-то звонит, чтобы сказать, что принтер 14 вышел из строя и нуждается в срочном ремонте, так что вы посмотрите на него и обнаружите, что принтер 14 - это струйный принтер в приемной. Только потому, что вы перетасовали идентификаторы, на самом деле точечный матричный принтер нуждается в срочном ремонте. Парня, который вызвал проблему, оставляют в покое, в то время как у администратора есть парень технической поддержки, которого она никогда не вызывала, чтобы починить принтер, который не сломался.

Вы должны думать об идентификаторах, назначенных системой автоинкремента, как о постоянных, они неизменны и не могут быть повторно использованы, даже если вещь, на которую ссылается идентификатор, перестает существовать. Некоторые люди утверждают, что им не нужно беспокоиться об исчерпании идентификаторов, но даже с 32-разрядными системами и подписанными идентификаторами все еще доступно около 2 миллиардов идентификаторов. Если вы можете сделать столбец идентификаторов без знака, то это удвоится до 4 миллиардов, и в 64-разрядных системах число доступных идентификаторов буквально больше, чем количество звезд на небе. Вы не собираетесь исчерпать удостоверения личности.

GordonM
источник
3
В большинстве случаев вы вообще не должны думать об автоматически сгенерированных числах, они бессмысленны и не должны быть открыты для пользователя. Вы никогда не должны получать сообщение о том, что в принтере 13 мало чернил, возможно, «принтер в комплекте 13», но не автоматически сгенерированный номер.
jmoreno
Да, но приведенный выше пример был именно таким: пример, иллюстрирующий, что может пойти не так, если вы возитесь с автоматически генерируемыми ключами. На самом деле это больше связано с ссылочной целостностью.
GordonM
Это только проблема RI, если у вас нет ограничений внешнего ключа и вместо этого есть внешние ключи psuedo. В этом случае у вас, вероятно, есть большие проблемы.
Jmoreno
Вы будете удивлены, как много баз данных mysql, с которыми я до сих пор сталкиваюсь, точно такие же. Многие разработчики, похоже, испытывают отвращение к innodb и даже к тем, кто не использует все его возможности.
ГордонМ
4

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

Чувствительные данные . Если пользователь удаляет его, лучше удалить его!

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

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

Поэтому я хотел бы спросить себя: будет ли пользователь (или кто-то другой, например, правительство) злиться, если я заставлю его поверить, что данные были удалены, но на самом деле я все еще получаю их и могу восстановить в любое время?

Jakob
источник
Интересный. Реально ли это реализуют крупные компании?
fuddin
2
Это хороший момент, но что касается вашего примера истории паролей - вы часто хотите хранить старые пароли, чтобы убедиться, что они не являются дубликатами ни одного из них за последние 12 лет или что-то подобное. Не поймите меня неправильно - мне не нравится эта политика, но я реализовал ее, и она кажется довольно распространенной в корпоративных приложениях.
Майк Партридж
2
Просто чтобы быть педантичным, вы никогда не должны хранить пароль где-либо. Вы сохраняете (односторонний) зашифрованный результат. Если кто-то забудет свой пароль, вы создадите для него новый. Не должно быть никакого способа «восстановить» пароль, потому что если вы можете это сделать, то может кто-то другой.
TMN
1
Номера кредитных карт. Никогда не должен храниться. На самом деле НЕ ДОЛЖНЫ храниться. Если клиент настолько глуп, чтобы отправить мне номер своей кредитной карты по электронной почте, у меня есть реальная проблема. Должны быть способы избавиться от этого.
gnasher729
GDPR ЕС передает свои пожелания.
displayname
3

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

Мы по необходимости отбрасываем данные бэкэнда, например данные сеанса с истекшим сроком действия на веб-сайте и старые данные журнала. Там нет никакого смысла держать их навсегда.

Тем не менее, как обычно, точный ответ действительно зависит от конкретной ситуации.

Мэтт С
источник
1

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

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

dbalakirev
источник
1

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

Вы должны добавить столбцы «Date_Time_Removed» в каждую таблицу, а затем вместо физического удаления строк, вы устанавливаете дату и время, когда строка была фактически удалена. Затем в ваших хранимых процедурах или sql вы бы включили столбец «Date_Time_Removed», например, выберите бла из таблицы 1, где date_time_removed равно нулю

Конечно, строки, которые были случайно добавлены в базу данных, должны быть удалены навсегда, особенно тестовые данные.

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

Джулиан Маммери
источник
0

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

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

Коралловая лань
источник