[database] 데이터베이스 : 레코드 삭제 여부

나는 이것에 대해 궁금해하는 유일한 사람이라고 생각하지 않습니다. 일반적으로 데이터베이스 동작에 대해 무엇을 연습합니까? 데이터베이스에서 물리적으로 레코드를 삭제 하시겠습니까? 아니면 레코드가 활성 또는 비활성임을 나타내는 “삭제됨”플래그 또는 부울 열로 레코드에 플래그를 지정하는 것이 더 낫습니까?



답변

확실히 데이터베이스의 실제 내용에 따라 다릅니다. 세션 정보를 저장하는 데 사용하는 경우 세션이 만료되거나 닫힐 때 즉시 삭제해야합니다. 실제적인 목적으로 다시 사용할 수 없기 때문입니다.

기본적으로 스스로에게 물어봐야 할 것은이 정보를 복원해야할까요? SO에서 삭제 된 질문과 마찬가지로 삭제 취소를 적극적으로 허용하고 있으므로 ‘삭제됨’으로 표시되어야합니다. 추가 작업없이 사용자를 선택하기 위해 표시 할 수도 있습니다.

데이터를 완전히 복원하려고하지 않지만 모니터링 (또는 유사한) 목적으로 데이터를 보관하고 싶은 경우. 나는 당신이 (물론 가능한 한) 집계 체계를 알아 내고 그것을 다른 테이블로 밀어내는 것을 제안 할 것입니다. 이렇게하면 기본 테이블에서 ‘삭제 된’데이터를 정리할 수있을뿐만 아니라 모니터링 목적 (또는 염두에 두었던 모든 것)에 맞게 보조 테이블을 최적화 할 수 있습니다.

임시 데이터는 http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/를 참조하십시오.


답변

삭제 플래그 사용의 장점 :

  1. 나중에 필요한 경우 데이터를 다시 가져올 수 있습니다.
  2. 삭제 작업 (플래그 업데이트)이 실제로 삭제하는 것보다 빠를 것입니다.

삭제 플래그 사용의 단점 :

  1. AND DeletedFlag = 'N'SQL 어딘가에서 놓치기 쉽습니다.
  2. 데이터베이스가 모든 쓰레기 중에서 관심있는 행을 찾는 데 더 느립니다.
  3. 결국에는 어쨌든 실제로 삭제하고 싶을 것입니다 (시스템이 성공했다고 가정합니다. 해당 레코드가 10 년 전이고 원래 생성 된 지 4 분 후에 “삭제”된 경우))
  4. 자연 키를 사용하지 못하게 할 수 있습니다. 자연 키가있는 하나 이상의 삭제 된 행과 동일한 자연 키를 사용하려는 실제 행이있을 수 있습니다.
  5. 실제로 데이터를 삭제해야하는 법적 / 준수 이유가있을 수 있습니다.

답변

모든 게시물에 대한 보완으로 …

그러나 레코드를 표시하려는 경우 활성 레코드에 대해보기를 만드는 것이 좋습니다. 이렇게하면 SQL 쿼리에서 플래그를 쓰거나 잊어 버리는 것을 방지 할 수 있습니다. 비활성 레코드에 대한보기도 목적에 부합한다고 생각하는 경우 고려할 수 있습니다.


답변

이 스레드를 발견하게되어 기쁩니다. 저도 사람들이이 문제에 대해 어떻게 생각하는지 궁금했습니다. 저는 많은 시스템에서 약 15 년 동안 ‘삭제 된 것으로 표시’를 구현했습니다. 사용자가 무언가를 실수로 삭제했다고 전화를 걸 때마다 다시 생성하거나 백업에서 복원하는 것보다 삭제 취소로 표시하는 것이 훨씬 쉬웠습니다.

우리는 postgresql과 Ruby on rails를 사용하고 있습니다. 두 가지 방법 중 하나로이를 수행 할 수있는 것처럼 보입니다. 레일을 수정하거나 ondelete 트리거를 추가하고 대신 pl / pgsql 함수를 사용하여 삭제 된 것으로 표시합니다. 나는 후자쪽으로 기울고있다.

성능 저하와 관련하여 대규모 테이블에서 몇 개의 삭제 된 항목과 많은 삭제 된 항목에 대한 EXPLAIN-ANALYZE 결과를 보는 것은 흥미로울 것입니다.

시간이 지남에 따라 사용되는 시스템에서 새로운 사용자는 실수로 항목을 삭제하는 것과 같은 어리석은 일을하는 경향이 있습니다. 따라서 사람들이 새로운 직위에있을 때 그들은 경험이없는 경우를 제외하고는 이전에 그 직위에 있던 사람의 모든 접근 권한을 갖게됩니다. 실수로 무언가를 삭제하고 신속하게 복구 할 수 있으면 모든 사람이 빠르게 작업에 복귀 할 수 있습니다.

그러나 누군가가 말했듯이 때로는 어떤 이유로 특정 키를 다시 필요로 할 수 있습니다. 그 시점에서 실제로 삭제 한 다음 레코드를 다시 만들어야합니다 (삭제 취소 및 레코드 수정시).


답변

개인 데이터가 관련된 경우 어느 쪽이든 법적 문제가 있습니다. 귀하의 위치 (또는 데이터베이스의 위치)와 이용 약관에 따라 크게 달라진다고 생각합니다.

어떤 경우에는 사람들이 시스템에서 제거를 요청할 수 있으며,이 경우 영구 삭제 (또는 최소한 모든 개인 정보 삭제)가 필요합니다.

개인 정보가 관련된 경우 어느 쪽이든 전략을 채택하기 전에 법률 부서에 확인하겠습니다.


답변

삭제 된 것으로 표시하고 실제로는 삭제하지 않습니다. 그러나 때때로 나는 모든 쓰레기를 청소하고 보관하므로 성능이 저하되지 않습니다.


답변

“휴면”레코드로 인해 데이터베이스 액세스 속도가 느려지는 것이 염려되는 경우 해당 행을 “아카이브”테이블 역할을하는 다른 테이블로 이동할 수 있습니다.