데이터베이스에서 데이터를 삭제해야합니까?


39

데이터베이스를 처음 사용하고 기본 개념을 이해하려고합니다. 데이터베이스에서 데이터를 삭제하는 방법을 배웠습니다. 그러나 내 친구 중 한 명이 데이터베이스의 데이터를 절대 삭제해서는 안된다고 말했습니다. 오히려 더 이상 필요하지 않은 경우 간단히 표시하거나 '사용하지 않음'으로 표시하는 것이 좋습니다.

그게 사실입니까? 그렇다면 IBM과 같은 대기업이 백 년 이상 데이터를 어떻게 처리할까요?


2
명확히하십시오-SQL에서 삭제 명령을 발행해야하는지 여부 또는 기본 데이터베이스 엔진이 삭제 된 것으로 표시되는 데이터를 실제로 삭제하는지 묻고 있습니까?
GrandmasterB

4
@StartupCrazy : 그 의견은 나를 위해 아무것도 명확하게하지 않습니다.
Doc Brown

6
"우리"는 누구를 의미합니까?
다이내믹

3
나는 모든 것을 거의 강박 적으로 유지하고 싶습니다. 그러나 나는 당신이 어떤 사업인지 모르지만 일정 시간 동안 법적으로 유지 해야하는 일부 데이터와 일정 시간이 지나면 법적으로 삭제 해야하는 일부 데이터가 있습니다.
피터 B

6
어떤 종류의 데이터인지에 따라 다릅니다. 경우에 따라 법적인 이유로 삭제해야합니다.
코드 InChaos

답변:


63

이 모든 것들과 마찬가지로 대답은 "의존적"입니다.

사용자가 데이터를 다시 원할 경우 친구가 옳습니다. 실제로 레코드를 "삭제됨"으로 표시하지는 않습니다. 이렇게하면 사용자가 마음을 바꾸면 데이터를 복구 할 수 있습니다.

그러나 삭제 된 데이터가 특정 기간 (예 : 1 년)을 초과하는 경우 실제로 라이브 테이블에서 데이터를 삭제하지만 아카이브 테이블에 보관하거나 사용자가 원하는 경우에만 백업하기로 결정할 수 있습니다. 다시. 이러한 방식으로 데이터 양 (실시간 및 최근 삭제)을 최소로 유지할 수 있습니다.

그러나 데이터가 일시적이거나 쉽게 재생성되는 경우 실제로 데이터를 삭제하기로 결정할 수 있습니다.

삭제 해야 할 데이터에는 한 가지 클래스가 있으며 , 사용자가 더 이상 보유하고 싶지 않은 개인 데이터입니다. 이를 의무 요건으로 만드는 현지 법률 (예 : EU)이있을 수 있습니다 ( Gavin 감사 )

마찬가지로 데이터를 삭제 하지 않아도되는 규칙이있을 수 있으므로 법을 준수하기 위해해야 ​​할 일에 대해 규제 당국에 확인해야 할 사항이 있습니다.


8
일부 응용 분야 (회계, 의료 기기)는 감사 요구 사항으로 인해 데이터를 삭제하지 않아야 할 수도 있습니다.
Paul

3
어떤 상황에서는 데이터를 삭제 해야 합니다 (예 : 사용자 개인 정보와 관련된 것). EU 법률 (및 기타)은 사용자에게 데이터 삭제를 요청할 권리가 있다고 명시합니다. 이 경우이 데이터를 삭제해야하며 더 이상 활성화되지 않은 것으로 플래그가 지정되지 않아야합니다. 후자는 개인 정보 보호법을 위반하는 것입니다.
Gavin Coates

데이터베이스에서 공간을 확보하면 성능이 향상됩니까?
viveksinghggits

17

이것은 실제로 많은 회사에서 중요한 문제입니다. 실제로 사용중인 데이터를 명확하게 확인할 수있는 방법은 없으므로 데이터베이스에 있습니다. 데이터 삭제 및 아카이빙은 모든 대규모 시스템 설계의 일부일 필요는 없지만 거의 그렇지 않습니다. 대부분의 회사는 시스템을 변경하고 현재 데이터를 식별 한 다음 해당 레코드를 새 시스템으로 마이그레이션하기 위해 상당한 노력을 기울일 때까지 더 큰 디스크를 구입하고 성능을 유지하기 위해 쿼리와 인덱스를 조정하는 것과 함께 살고 있습니다.

예, 데이터베이스에서 데이터를 삭제 해야 하지만, 언제, 언제 무엇을 말하는지는 간단하지 않습니다.


1
"실제로 사용중인 데이터를 명확하게 결정할 수있는 방법이 없습니다."-동의하지 않습니다. 각 테이블의 "삭제 된"비트 필드는 레코드를 더 이상 관련이없는 것으로 식별하는 매우 깔끔한 방법입니다. 삭제를 계단식으로 만드는 방법과 같이 문제가 제기하는 대부분의 질문도 물리적 삭제 구성표에 있으며 답변은 데이터 모델 및 스토리지 크기 또는 성능을 더 중요하게 평가하는지 여부에 따라 다릅니다.
KeithS

그것이 내가 말한 것입니다. 시스템은 일종의 만료 표시기로 설계되어야합니다. 이러한 지표 (많은 회사의 경우)가 없으면 안전하게 삭제할 수있는 레코드를 식별 할 수있는 방법이 없습니다.
TMN

12

이미 "상황에 따라 다름"으로 귀결되는 좋은 답변이 이미 많았으며 이에 대한 답변을 추가 할 수 없습니다.

그러나 언급하지 않은 한 가지 언급해야 할 것은 시퀀스 또는 AUTO_INCREMENT 시스템에 의해 생성 된 기본 키를 절대 재사용해서는 안된다는 것입니다.

이러한 시스템에 의해 기본 키가 할당 된 항목을 삭제하면 기본 키 열에 삭제 된 데이터가 남는 간격이 생깁니다. 이러한 차이를 새 항목에 추가 할 때 새 항목에 재 할당하거나 기존 데이터를 섞어 새 ID를 제공하여 공백을 제거하려는 유혹이 있지만 그렇게하면 문제가 발생할 수 있습니다 방금 열쇠를 내버려두면 다룰 필요가 없습니다.

재주문 소모품 관리를 위해 프린터 데이터베이스를 유지한다고 가정 해보십시오. 오래된 레이저 프린터 인 프린터 13은 경제적 인 수리를 넘어 분해되어 버립니다. 한편, 관련이없는 이유로 누군가가 창고에서 바코드 인쇄를 위해 새 감열 식 프린터를 주문하고 그 프린터는 프린터를 교체하기 전에 도착합니다. 관리자는 새 프린터를 데이터베이스에 기록합니다. ID를 재활용하는 경우 새 감열 식 프린터에는 ID가 13으로 할당됩니다.

이제 누군가 프린터 13에 잉크가 거의 없다고 알려줍니다. 프린터 13은 레이저 프린터이므로 데이터베이스에서 프린터를 검색하지 않아도되고 토너 카트리지를 주문해야합니다. 프린터 13은 더 이상 레이저 프린터가 아니기 때문에 감열 잉크 팩을 주문해야합니다. 토너 카트리지가 도착하면 프린터의 잉크 리필이 잘못되어 사용할 수 없습니다. 더 이상 바코드를 인쇄 할 수 없으며 배송 대기중인 주문을 배송 할 수 없습니다.

더 나쁜 것은, 프린터 13을 삭제하고 그 이후에 나오는 모든 프린터를 틈새를 채우기 위해 섞으면 어떻게됩니까? 프린터 14 (일부 낡은 도트 매트릭스)는 프린터 13이되고 프린터 15는 프린터 14가됩니다.

모든 프린터에는 레이블이있어 데이터베이스와 상호 참조 할 수 있지만 이제 모든 레이블이 오래되었습니다. 일주일 내내 사업에있는 모든 프린터를 찾아 (수백 개가 될 수 있음) 레이블을 다시 지정해야합니다. 그것은 효과적인 시간 활용이 아닙니다. 또한 오류가 발생하기 쉬운 프로세스이며 완료되지 않은 경우 어떻게됩니까? 누군가 프린터 14가 고장 나고 긴급하게 수리해야한다고 전화를 걸어 프린터 14가 잉크젯 프린터라는 것을 알게되었습니다. 주위에 ID를 섞었기 때문에 실제로 도트 매트릭스 프린터가 시급히 수정되어야합니다. 문제를 일으킨 사람은 교수형에 처해있는 반면, 접수 원은 기술 지원 담당자가 있었지만 끊어지지 않은 프린터를 수리하기 위해 전화를 걸지 않았습니다.

자동 증분 시스템에 의해 할당 된 ID는 영구적 인 것으로 생각해야하며, ID가 참조하는 것이 존재하지 않더라도 변경할 수 없으며 재사용 할 수 없습니다. 일부 사람들은 ID가 부족할 염려가 없다고 주장하지만 32 비트 시스템 및 서명 된 ID를 사용하더라도 여전히 20 억 개 정도의 ID를 사용할 수 있습니다. ID 열을 부호없는 것으로 만들 수 있다면 이것은 40 억으로 두 배가되며 64 비트 시스템에서 사용 가능한 ID의 수는 문자 그대로 하늘의 별 수보다 큽니다. ID가 부족하지 않습니다.


3
대부분의 경우 자동 생성 숫자를 전혀 생각해서는 안되며 의미가 없으며 사용자에게 노출되어서는 안됩니다. 프린터 13에 잉크가 부족하다는 메시지가 표시되지 않아야합니다. "스위트 13의 프린터"일 수 있지만 자동 생성 된 숫자는 아닙니다.
jmoreno

사실이지만 위의 예는 자동 증가 생성 키로 혼란 스러울 경우 무엇이 잘못 될 수 있는지 보여주는 예입니다. 실제로는 참조 무결성과 관련이 있습니다.
GordonM

외래 키 제약 조건이없고 psuedo 외래 키가있는 경우 RI 문제 일뿐입니다. 어떤 경우에는 더 큰 문제가있을 수 있습니다.
jmoreno

내가 여전히 얼마나 많은 mysql 데이터베이스를 실행하는지 놀라실 것입니다. 많은 개발자가 innodb에 대한 혐오감을 느끼고 있으며 모든 기능을 사용하지 않는 개발자도 있습니다.
GordonM

4

여기에 좋은 답변이 많이 있습니다. 아직 아무도 언급하지 않은 상황을 하나 추가하고 싶습니다.

민감한 데이터 . 사용자가 삭제하면 실제로 삭제하는 것이 좋습니다.

가장 일반적인 상황은 비밀번호 변경 / 재설정입니다. 데이터베이스에 이전 비밀번호 (해시, 솔트 등)를 저장하고 싶지 않습니다. 사용자가 다른 사이트에서 이전 (잘못된) 암호를 사용하고있을 수 있습니다.

또한 특정 유형의 데이터를 얼마나 오래 저장할 수 있는지에 관한 법률에 관해서는 물론 소프트 삭제는 수행하지 않습니다. 실제로 삭제해야합니다.

그래서 나는 나 자신에게 물을 것입니다 : 데이터가 삭제되었다고 생각하게하면 사용자 (또는 다른 정부, 예를 들어 정부)가 화를 낼 것이지만 실제로는 여전히 그것을 가지고 있으며 언제든지 복원 할 수 있습니까?


흥미 롭군 대기업이 실제로 이것을 구현합니까?
fuddin

2
이것은 좋은 점이지만 암호 기록 예와 관련하여 이전 암호를 저장하여 과거 12 개 또는 그 밖의 어떤 것도 복제하지 않도록 할 수 있습니다. 잘못 이해하지 마십시오. 저는이 정책이 마음에 들지 않지만 구현했습니다. 엔터프라이즈 Y 앱에서는 일반적으로 사용됩니다.
마이크 Partridge

2
pedantic하기 위해, 당신은 어디에도 암호를 저장 해서는 안됩니다 . (단방향) 암호화 된 결과를 저장합니다. 누군가 비밀번호를 잊어 버린 경우 새 비밀번호를 생성합니다. 암호를 "복구"할 수있는 방법이 없어야합니다. 가능하면 다른 사람도 가능하기 때문입니다.
TMN

1
신용 카드 번호 절대 보관하지 마십시오. 실제로는 절대 저장해서는 안됩니다. 고객이 신용 카드 번호를 이메일로 보낼 정도로 바보 인 경우에는 실제 문제가 있습니다. 그것을 제거하는 방법이 있어야합니다.
gnasher729

EU GDPR은 그들의 안부를 전합니다.
표시 이름

3

일반적으로 데이터베이스에서 사용자 데이터를 제거하지 않습니다. 숨겨 지도록 신고합니다. 너무 자주 사용자가 실수로 무언가를 삭제하고 쉽게 교체해야합니다. 또한 관련 데이터에 대한 참조 무결성을 유지하는 데 도움이됩니다. 중소 규모의 데이터베이스에서 작동합니다. 이 결정에 의해 성능이 크게 영향을받는 시스템에서는 아카이브 테이블, 자동 백업 등과 같은 특별한 방식으로 처리됩니다.

필요에 따라 백엔드 데이터 (예 : 만료 된 웹 사이트 세션 데이터 및 오래된 로그 정보)를 버립니다. 그것들을 영원히 지키는 데는 아무런 의미가 없습니다.

그러나 평소와 같이 정확한 답변은 특정 상황에 따라 다릅니다.


1

나는 이것이 일어난 몇 년 동안 외환 응용 프로그램에서 일해 왔습니다. 응용 프로그램이 수년에 걸쳐 수집 한 데이터는 성능에 영향을 미쳤습니다 (예 : 지수).

코드 측면에서 우리가 할 수있는 일을 완료 한 후 1 년보다 오래된 데이터를 보관하기 위해 관리 부서에 제안했습니다. 그들은 개념 (법적 문제)을 확인했고 운 좋게도 우리는 그것을 할 수있었습니다. 그래서 우리는 삭제했지만 비즈니스가 보고서 등을 계속 실행할 수 있도록 데이터를 보관했습니다.


1

대부분의 경우 미래에 필요할 경우를 대비하여 데이터를 보관해야합니다. 당신이 일하는 사업체는 회사를 특정 방향으로 이끌 수있는 결정에 근거하여 과거 데이터를보고 싶을 수 있습니다.

각 테이블에 'Date_Time_Removed'열을 추가 한 다음 행을 실제로 삭제하는 대신 행이 실제로 삭제 된 날짜와 시간을 설정해야합니다. 그런 다음 저장 프로 시저 또는 SQL에서 'Date_Time_Removed'열을 고려합니다. 예를 들어 date_time_removed가 null 인 table1에서 blah를 선택하십시오.

물론 데이터베이스에 실수로 추가 된 행, 특히 테스트 데이터는 영구적으로 제거해야합니다.

모든 합법적 인 데이터를 유지함으로써 차후에 창고에 데이터베이스를 사용할 수도 있습니다.


0

제시된 다른 상황은 데이터가 삭제되는 경우이지만 데이터베이스 (삭제 포함)에서 수행 된 작업 로그는 오랫동안 아카이브에 저장됩니다. 이것의 주요 범위는 과거 날짜까지 롤백 시스템을 구현하는 것이지만 삭제 된 데이터 (데이터베이스에서 삭제되었지만 아카이브에 저장 됨)를 저장하는 데 사용될 수도 있습니다.

삭제 된 데이터의 아카이브를 저장하는 것은 그리 큰 일이 아닙니다. 대기업은 또한 코드 버전과 더 많은 정보 (기술적으로 관련되지 않은 내용에 대해서는 이야기하지 않음)를 저장할 수 있으므로 결국에는 큰 데이터를 저장하는 것이 일반적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.