Czy powinniśmy kiedykolwiek usuwać dane z bazy danych?

39

Jestem nowy w bazach danych i staram się zrozumieć podstawowe pojęcia. Nauczyłem się, jak usuwać dane z bazy danych. Ale jeden z moich przyjaciół powiedział mi, że nigdy nie należy usuwać danych z bazy danych. Zamiast tego, gdy nie jest już potrzebny, lepiej po prostu oznaczyć go lub oznaczyć jako „nieużywany”.

Czy to prawda? Jeśli tak, to w jaki sposób duża firma, taka jak IBM, będzie przetwarzać swoje dane przez sto lub więcej lat?

fuddin
źródło
2
Wyjaśnij - czy pytasz, czy powinieneś wydawać polecenia usuwania w SQL, czy pytasz, czy bazowy silnik bazy danych faktycznie usuwa dane, które są oznaczone jako usunięte?
GrandmasterB,
4
@StartupCrazy: ten komentarz nic dla mnie nie wyjaśnia.
Doc Brown
6
Kto ma na myśli „my”?
Dynamiczny
3
Bardzo lubię trzymać wszystko niemal obsesyjnie. Ale nie wiem, w jakiej branży jesteś, ale niektóre dane, które prawnie musisz przechowywać przez określony czas, a niektóre dane, które prawnie musisz usunąć po określonym czasie.
Pieter B
6
Zależy od tego, jakie to dane. W niektórych przypadkach musisz go usunąć ze względów prawnych.
CodesInChaos

Odpowiedzi:

63

Podobnie jak w przypadku wszystkich tych rzeczy, odpowiedź brzmi „to zależy”.

Jeśli użytkownik może chcieć odzyskać dane, znajomi mają rację - tak naprawdę nie usuwasz, po prostu zaznacz rekord jako „usunięty”. W ten sposób, gdy użytkownik zmieni zdanie, możesz odzyskać dane.

Jeśli jednak usunięte dane są starsze niż pewien okres (na przykład rok), możesz zdecydować, aby naprawdę usunąć je z tabel na żywo, ale zachować je w tabeli archiwum lub nawet w celu wykonania kopii zapasowej, jeśli użytkownik kiedykolwiek zechce to z powrotem. W ten sposób możesz ograniczyć ilość danych (bieżących i ostatnio usuniętych) do minimum.

Jeśli jednak dane są efemeryczne lub można je łatwo odtworzyć, możesz zdecydować o ich usunięciu.

Istnieje jedna klasa danych, którą musisz usunąć - a są to dane osobowe, których użytkownik nie chce, abyś już przechowywał. Mogą istnieć lokalne przepisy (np. W UE), które czynią to obowiązkowym wymogiem (dzięki Gavin )

Podobnie mogą istnieć zasady, które wymagają, aby nie usuwać danych, więc przed podjęciem jakiejkolwiek decyzji sprawdź u organów regulacyjnych, co musisz zrobić, aby zachować zgodność z prawem.

ChrisF
źródło
8
Niektóre obszary zastosowań (rachunkowość, urządzenia medyczne) prawdopodobnie wymagają, aby dane nie były usuwane z powodu wymagań audytu.
Paul
3
W niektórych okolicznościach MUSISZ usunąć dane, na przykład wszystko związane z danymi osobowymi użytkowników. Prawo UE (i ewentualnie inne) stanowi, że użytkownik powinien mieć prawo do żądania usunięcia jego danych. W takim przypadku dane te muszą zostać usunięte, a nie tylko oznaczone jako nie aktywne. To ostatnie byłoby pogwałceniem przepisów dotyczących prywatności.
Gavin Coates,
czy zwolnienie miejsca w bazie danych zwiększa wydajność?
viveksinghggits
17

Jest to w rzeczywistości znaczący problem dla wielu firm. Nie ma sposobu, aby dokładnie określić, które dane są faktycznie używane, więc po prostu znajdują się w bazie danych. Usuwanie i archiwizacja danych musi być częścią każdego dużego projektu systemu, ale rzadko tak jest. Większość firm po prostu sobie z tym radzi, kupując większe dyski i poprawiając swoje zapytania i indeksy w celu utrzymania wydajności, dopóki nie zmienią systemów, a następnie podejmą znaczne wysiłki, aby zidentyfikować bieżące dane, a następnie migrować tylko te rekordy do nowego systemu.

Tak, powinieneś usunąć dane ze swojej bazy danych, ale często nie jest łatwo powiedzieć, co i kiedy.

TMN
źródło
1
„Nie ma sposobu, aby dokładnie określić, które dane są faktycznie używane” - nie zgadzam się. Pole bitowe „IsDeleted” w każdej tabeli jest dość czystym sposobem na zidentyfikowanie rekordu jako już nieistotnego. Większość postawionych pytań, takich jak kaskadowe usuwanie, jest również obecna w schematach usuwania fizycznego, a odpowiedzi zależą od modelu danych i tego, czy bardziej cenisz wielkość pamięci lub wydajność.
KeithS,
Tak mówiłem, systemy muszą być zaprojektowane z pewnym wskaźnikiem wygasania. W przypadku braku tych wskaźników (co ma miejsce w przypadku wielu firm) nie ma sposobu, aby ustalić, które rekordy można bezpiecznie usunąć.
TMN
12

Było już wiele dobrych odpowiedzi na to pytanie, które sprowadzają się do „Zależy od okoliczności” i nie mogę do nich niczego dodać.

Jedną rzeczą, o której nie wspomniano, ale myślę, że należy o tym wspomnieć, jest to, że nigdy nie powinieneś nigdy ponownie używać kluczy podstawowych, które zostały wygenerowane przez sekwencję lub system AUTO_INCREMENT.

Gdy usuniesz element, któremu przypisano klucz podstawowy przez taki system, w kolumnie klucza podstawowego pozostaną luki pozostawione przez usunięte dane. Istnieje wielka pokusa, aby przypisać te luki do nowych elementów w miarę ich dodawania, a nawet gorzej, aby przetasować istniejące dane, aby nadać im nowy identyfikator w celu usunięcia luk, ale spowoduje to problemy, które możesz nigdy nie będziesz musiał sobie z tym radzić, jeśli zostawiłeś klucze w spokoju.

Załóżmy, że przechowujesz bazę drukarek do zarządzania zamawianiem materiałów eksploatacyjnych. Drukarka 13, stara drukarka laserowa, psuje się poza ekonomiczną naprawą, więc ją wyrzucasz. Tymczasem z niezwiązanego powodu ktoś zamawia nową drukarkę termiczną do drukowania kodów kreskowych w magazynie, a ta drukarka zdarza się przed wymianą na drukarkę 13. Administrator rejestruje tę nową drukarkę w bazie danych, a ponieważ 13 jest teraz darmowa i przetwarzasz identyfikatory, nowa drukarka termiczna otrzymuje 13 jako swój identyfikator.

Teraz ktoś mówi ci, że w drukarce 13 prawie nie ma atramentu. Pamiętasz, że drukarka 13 jest drukarką laserową, więc nie zawracaj sobie głowy jej wyszukiwaniem w bazie danych i złożysz zamówienie na kasetę z tonerem. Tylko ty faktycznie musiałeś zamówić termiczny zestaw atramentów, ponieważ drukarka 13 nie jest już drukarką laserową. Gdy nadejdzie kaseta z tonerem, nie możesz jej użyć, ponieważ jest to zły wkład atramentu do drukarki, nie możesz wydrukować więcej kodów kreskowych i nie możesz wysłać żadnych zamówień oczekujących na wysłanie.

Co gorsza, co się stanie, jeśli usuniesz drukarkę 13 i przetasujesz wszystkie drukarki, które pojawią się po niej, aby wypełnić lukę? Drukarka 14 (niektóre zniszczona stara matryca punktowa) staje się drukarką 13, drukarka 15 staje się drukarką 14 i tak dalej.

Wszystkie drukarki mają na sobie etykiety, dzięki czemu można je odnieść do bazy danych, ale teraz wszystkie etykiety są nieaktualne. Musisz się obejść, zlokalizować każdą drukarkę w firmie (która może mieć setki!) I ponownie oznaczyć je etykietą. To nie jest efektywne wykorzystanie czasu. Jest to również proces podatny na błędy, a co się stanie, jeśli nigdy się nie uda? Ktoś dzwoni, by powiedzieć, że drukarka 14 zepsuła się i wymaga pilnej naprawy, więc sprawdź to i okaże się, że drukarka 14 jest drukarką atramentową w recepcji. Tylko dlatego, że przetasowałeś identyfikatory, tak naprawdę drukarka igłowa wymaga pilnej naprawy. Facet, który wezwał problem, pozostaje zawieszony, podczas gdy recepcjonistka ma faceta z działu pomocy technicznej, którego nigdy nie wezwała, aby naprawić drukarkę, która nie była zepsuta.

Powinieneś pomyśleć o identyfikatorach przypisanych przez system automatycznego przyrostu jako stałych, są one niezmienne i nie mogą być ponownie użyte, nawet jeśli rzecz, do której odnosi się identyfikator, przestaje istnieć. Niektóre osoby twierdzą, że nie chcą się martwić wyczerpaniem identyfikatorów, ale nawet w przypadku systemów 32-bitowych i podpisanych identyfikatorów nadal dostępnych jest około 2 miliardów identyfikatorów. Jeśli możesz sprawić, by kolumna ID była niepodpisana, liczba ta podwoi się do 4 miliardów, aw systemach 64-bitowych liczba dostępnych identyfikatorów jest dosłownie większa niż liczba gwiazd na niebie. Nie zabraknie ci identyfikatorów.

GordonM
źródło
3
W większości przypadków nie należy w ogóle myśleć o liczbach generowanych automatycznie, są one pozbawione znaczenia i nie powinny być udostępniane użytkownikowi. Nigdy nie powinieneś otrzymywać komunikatu informującego o niskim poziomie atramentu w drukarce 13, może „drukarce w pakiecie 13”, ale nie w automatycznie generowanym numerze.
jmoreno
To prawda, ale powyższy przykład był dokładnie taki, przykład ilustrujący, co może pójść nie tak, jeśli będziesz bałaganić za pomocą kluczy generowanych automatycznie. W rzeczywistości chodzi raczej o integralność referencyjną.
GordonM,
Jest to tylko problem RI, jeśli nie masz ograniczeń klucza obcego, a zamiast tego masz klucze obce psuedo. W takim przypadku prawdopodobnie masz większe problemy.
jmoreno
Byłbyś zaskoczony, jak wiele baz danych MySQL wciąż na nie napotykam. Wielu programistów wydaje się mieć awersję do innodb, a nawet ci, którzy nie korzystają ze wszystkich jego funkcji.
GordonM,
4

Wiele dobrych odpowiedzi już tutaj. Chcę tylko dodać jedną sytuację, o której nikt jeszcze nie wspomniał:

Dane wrażliwe . Jeśli użytkownik go usunie, lepiej go faktycznie usuń!

Jedną z bardzo częstych sytuacji, które przychodzą na myśl, jest zmiana / zresetowanie hasła. Nie chciałbyś przechowywać starych haseł (nawet jeśli są one mieszane, solone itp.) W bazie danych. Użytkownicy mogą używać swoich starych (i złych) haseł w innych witrynach.

Ponadto, jeśli chodzi o przepisy dotyczące tego, jak długo możesz przechowywać określone rodzaje danych, wówczas oczywiście nie będą wykonywane miękkie usunięcia. Musisz go usunąć.

Więc zadałbym sobie pytanie: czy użytkownik (lub ktoś inny, na przykład rząd) będzie wściekły, jeśli przekonam ich, że dane zostały usunięte, ale w rzeczywistości nadal je mam i mogę je przywrócić w dowolnym momencie?

Jakob
źródło
Ciekawy. Czy duże firmy naprawdę to wdrażają?
fuddin
2
To dobra uwaga, ale jeśli chodzi o przykład historii haseł - często chcesz przechowywać stare hasła, aby mieć pewność, że nie będą duplikatami żadnego z poprzednich 12 ani nic takiego. Nie zrozum mnie źle - nie podoba mi się ta zasada, ale ją wdrożyłem i wydaje się dość powszechna w aplikacjach dla przedsiębiorstw.
Mike Partridge
2
Aby być pedantycznym, nigdy nie należy przechowywać hasła w dowolnym miejscu. Przechowujesz (za jednym razem) zaszyfrowany wynik. Jeśli ktoś zapomni hasło, wygenerujesz dla niego nowe. Nie powinno być ŻADNEGO SPOSOBU „odzyskania” hasła, ponieważ jeśli możesz to zrobić, może to zrobić ktoś inny.
TMN
1
Numery kart kredytowych. Nigdy nie powinien być przechowywany. W rzeczywistości MUSI nigdy nie być przechowywany. Jeśli klient jest na tyle głupi, aby przesłać mi swój numer karty kredytowej w wiadomości e-mail, mam poważny problem. Muszą być sposoby, aby się go pozbyć.
gnasher729
RODO UE przesyła ich pozdrowienia.
nazwa wyświetlana
3

Zasadniczo nie usuwam danych użytkowników z moich baz danych. Oznaczam je jako ukryte. Zbyt często użytkownik usuwa coś przypadkowo i wymaga łatwej wymiany. Pomaga również zachować integralność referencyjną powiązanych danych. Działa to w przypadku baz danych o małych i średnich rozmiarach. W systemach, w których decyzja ta ma duży wpływ na wydajność, jest obsługiwana w specjalny sposób, np. Tabele archiwów, automatyczne kopie zapasowe itp.

W razie potrzeby usuwamy dane zaplecza, np. Wygasłe dane sesji strony internetowej i stare informacje z dziennika. Nie ma sensu trzymać ich na zawsze.

Jak zwykle jednak dokładna odpowiedź naprawdę zależy od konkretnej sytuacji.

Matt S.
źródło
1

Od kilku lat pracuję nad aplikacją wymiany walut. Dane zbierane przez aplikację przez lata miały wpływ na wydajność (powiedzmy wykładniczo).

Po zrobieniu wszystkiego, co w naszej mocy, jeśli chodzi o kod, zaproponowaliśmy zarządowi zarchiwizowanie danych starszych niż rok. Sprawdzili koncepcję (kwestie prawne) i na szczęście udało nam się to zrobić. Usunęliśmy, ale zarchiwizowaliśmy dane, aby firma mogła nadal generować raporty itp.

dbalakirev
źródło
1

W większości przypadków należy przechowywać dane na wypadek, gdyby były potrzebne w przyszłości. Firma, dla której pracujesz, może chcieć spojrzeć na dane historyczne, aby oprzeć swoje decyzje na tym, co skieruje firmę w określonym kierunku.

Powinieneś dodać kolumny „Date_Time_Removed” do każdej tabeli, a następnie zamiast fizycznie usuwać wiersze, ustaw datę i godzinę wirtualnego usunięcia wiersza. Następnie w procedurach przechowywanych lub sql weźmiesz pod uwagę kolumnę „Date_Time_Removed”, np. Wybierz bla z tabeli 1, gdzie data_czas_usunięta ma wartość null

Oczywiście wiersze, które zostały przypadkowo dodane do bazy danych, powinny zostać trwale usunięte, zwłaszcza dane testowe.

Zachowując wszystkie legalne dane, musisz również skorzystać z bazy danych do magazynowania w przyszłości.

Julian Mummery
źródło
0

Inna sytuacja niż inne przedstawione to sytuacja, gdy dane są usuwane, ale dzienniki operacji wykonanych w bazie danych (łącznie z usunięciem) są przechowywane w archiwach przez długi okres czasu. Głównym celem tego jest wdrożenie systemu przywracania poprzednich dat, ale można go również wykorzystać do przechowywania w pewien sposób usuniętych danych (które są usuwane z bazy danych, ale przechowywane w archiwach).

Przechowywanie archiwów usuniętych danych nie byłoby tak wielką sprawą. Duże firmy mogą także przechowywać wersje kodu i wiele innych informacji (nie mówiąc już o rzeczach nietechnicznych), więc w końcu przechowywanie dużych danych jest dla nich czymś zwyczajnym.

Coral Doe
źródło