나는 이것에 대해 궁금해하는 유일한 사람이라고 생각하지 않습니다. 일반적으로 데이터베이스 동작에 대해 무엇을 연습합니까? 데이터베이스에서 물리적으로 레코드를 삭제 하시겠습니까? 아니면 레코드가 활성 또는 비활성임을 나타내는 "삭제됨"플래그 또는 부울 열로 레코드에 플래그를 지정하는 것이 더 낫습니까?
나는 이것에 대해 궁금해하는 유일한 사람이라고 생각하지 않습니다. 일반적으로 데이터베이스 동작에 대해 무엇을 연습합니까? 데이터베이스에서 물리적으로 레코드를 삭제 하시겠습니까? 아니면 레코드가 활성 또는 비활성임을 나타내는 "삭제됨"플래그 또는 부울 열로 레코드에 플래그를 지정하는 것이 더 낫습니까?
답변:
확실히 데이터베이스의 실제 내용에 따라 다릅니다. 세션 정보를 저장하는 데 사용하는 경우 세션이 만료되거나 닫힐 때 즉시 삭제해야합니다. 실제적인 목적으로 다시 사용할 수 없기 때문입니다.
기본적으로 스스로에게 물어봐야 할 것은이 정보를 복원해야할까요? SO에서 삭제 된 질문과 마찬가지로 삭제 취소를 적극적으로 허용하고 있으므로 '삭제됨'으로 표시되어야합니다. 추가 작업없이 사용자를 선택하기 위해 표시 할 수도 있습니다.
데이터를 완전히 복원하려고하지 않지만 모니터링 (또는 유사한) 목적으로 데이터를 보관하고 싶은 경우. 나는 당신이 (물론 가능한 한) 집계 체계를 알아 내고 그것을 다른 테이블로 밀어내는 것을 제안 할 것입니다. 이렇게하면 기본 테이블에서 '삭제 된'데이터를 정리할 수있을뿐만 아니라 모니터링 목적 (또는 염두에 두었던 모든 것)에 맞게 보조 테이블을 최적화 할 수 있습니다.
임시 데이터는 http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/를 참조하십시오.
삭제 플래그 사용의 장점 :
삭제 플래그 사용의 단점 :
AND DeletedFlag = 'N'
SQL 어딘가에서 놓치기 쉽습니다.이 스레드를 발견하게되어 기쁩니다. 저도 사람들이이 문제에 대해 어떻게 생각하는지 궁금했습니다. 저는 많은 시스템에서 약 15 년 동안 '삭제 된 것으로 표시'를 구현했습니다. 사용자가 무언가를 실수로 삭제했다고 전화를 걸 때마다 다시 생성하거나 백업에서 복원하는 것보다 삭제 취소로 표시하는 것이 훨씬 쉬웠습니다.
우리는 postgresql과 Ruby on rails를 사용하고 있습니다. 두 가지 방법 중 하나로이를 수행 할 수있는 것처럼 보입니다. 레일을 수정하거나 ondelete 트리거를 추가하고 대신 pl / pgsql 함수를 사용하여 삭제 된 것으로 표시합니다. 나는 후자쪽으로 기울고있다.
성능 저하와 관련하여 대규모 테이블에서 몇 개의 삭제 된 항목과 많은 삭제 된 항목에 대한 EXPLAIN-ANALYZE 결과를 보는 것은 흥미로울 것입니다.
시간이 지남에 따라 사용되는 시스템에서 새로운 사용자는 실수로 항목을 삭제하는 것과 같은 어리석은 일을하는 경향이 있습니다. 따라서 사람들이 새로운 직위에있을 때 그들은 경험이없는 경우를 제외하고는 이전에 그 직위에 있던 사람의 모든 접근 권한을 갖게됩니다. 실수로 무언가를 삭제하고 신속하게 복구 할 수 있으면 모든 사람이 빠르게 작업에 복귀 할 수 있습니다.
그러나 누군가가 말했듯이 때로는 어떤 이유로 특정 키를 다시 필요로 할 수 있습니다. 그 시점에서 실제로 삭제 한 다음 레코드를 다시 만들어야합니다 (삭제 취소 및 레코드 수정시).