복붙노트

[SQL] 소프트 삭제는 좋은 아이디어인가? [복제]

SQL

소프트 삭제는 좋은 아이디어인가? [복제]

소프트 삭제는 좋은 아이디어 나 좋은 생각이 있습니까?

대신 실제로 데이터베이스에 기록을 삭제, 당신 것에 isDeleted = 사실, 같은과 기록을 거짓으로 당신이 할 수 단지 플래그가 회복에 따라 단지 플래그를.

이것은 좋은 아이디어인가?

물리적으로 다음 레코드를 삭제가 아카이브 데이터베이스로 이동하는 좋은 아이디어이며, 사용자가 레코드 등을하고자하는 경우, 다음 소프트웨어는 아카이브에서 레코드에 대한보고를 다시 것인가?

해결법

  1. ==============================

    1.나는 (아마도 몇 가지 예외를 제외하고) 일반적으로 나쁜 생각, 말할.

    나는 (아마도 몇 가지 예외를 제외하고) 일반적으로 나쁜 생각, 말할.

    당신이 (이것은 물론, 단지 부가 데이터의 삭제 않는 한) 영구적 때문에 DELETE의 데이터를 잃을 상황에서 않을 것입니다, 그래서 먼저, 데이터베이스는 정기적으로 백업해야합니다.

    둘째, 당신이 지금에 isDeleted = 거짓이 테이블의 모든 쿼리 절 (당신은이 테이블을 조인하는 경우 훨씬 더)를 포함 할이 수단과 같은 부드러운 삭제합니다. 여기의 실수로 즉시 사용자로 잡힐 것 또는 테스터는 시간이 걸릴 수 있습니다 다시 보여주는 삭제 된 기록을 발견했습니다. 또한, 생략 COUNT에서 절 (나는이 년 동안 발생했던 하나 개의 프로젝트에 근무 발견하는 더 오래 걸릴 수 있습니다 (*) 쿼리, 어디에 개발자 쉬울 것이다;하지 많은 레코드가 이제까지했다 "삭제" , 그래서) 합계 가까이 예상했던 것과 있었다 아무도 주목하지 않는다.

    마지막으로, 잠재적으로 부드러운 삭제 인공 키 테이블에 작동하지만 자연 기본 키 테이블에없는 작업 (예 : 사회 보장 번호에 의해 키가 테이블에서 사람을 "삭제"할 것이다 - 당신은 때 무엇을해야합니까 필요가 그를 다시 추가? "복합 기본 키에 isDeleted를 포함".) 말을하지 마십시오.

    디자인 리뷰에서 필자는 개발자가 비용과 편익에 대한 인식을 설명하고, 이러한 방식으로 부드러운 삭제 작업을 수행하는 훌륭한 이유를 제시 할 것으로 예상한다. "왜 그것을하지?" 훌륭한 이유가 없습니다.

  2. ==============================

    2.그것은 잠재적 인 데이터 손실을 방지 할 수있는 좋은 생각이 결코 없다.

    그것은 잠재적 인 데이터 손실을 방지 할 수있는 좋은 생각이 결코 없다.

    나는 항상 소프트 삭제합니다. 데이터베이스 요구 사항이 하나 개 이상의 레코드의 세정 할 경우에, 나는 일반적으로 하나 소프트 삭제의 2 단계 프로세스를 채용 한 후 "휴지통"레코드 또는 문서 기록 할 수있는 문서 관리 스타일의 접근 방식을 비우는 세 멀리, 그리고 다음 하드 삭제하기 전에 승인을 받아야합니다.

  3. ==============================

    3.그것은 상황에 따라 달라집니다. 난 당신이 법적으로 진정으로 삭제 뭔가 필요한 상황을 볼 수 있었다. 어쩌면 누군가가 자신의 사회 보장 번호가 영구적으로 시스템에서 제거 할 것을 요청했습니다. 아니면 당신은 당신이 단일 레코드로 통합하려는 중복 기록을 가지고있다. 삭제 된 플래그 주위의 중복 매달려를 유지하는 것은 유리하지 않을 수 있습니다.

    그것은 상황에 따라 달라집니다. 난 당신이 법적으로 진정으로 삭제 뭔가 필요한 상황을 볼 수 있었다. 어쩌면 누군가가 자신의 사회 보장 번호가 영구적으로 시스템에서 제거 할 것을 요청했습니다. 아니면 당신은 당신이 단일 레코드로 통합하려는 중복 기록을 가지고있다. 삭제 된 플래그 주위의 중복 매달려를 유지하는 것은 유리하지 않을 수 있습니다.

    하나의 기술적 단점도있다 : 당신은 자동으로 외래 키 위반을 방지하기 위해 삭제 된 데이터에 대한 참조를 지우 삭제를 계단식 할 수 없습니다. 이것은 반드시 큰 문제가되지 않습니다,하지만 명심해야 할 일이다.

    그렇지 않으면, 나는 그것이 좋은 아이디어 같아요.

  4. ==============================

    4.당신이 부드러운 삭제를 사용하려고하는 경우, 그것은 대신 is_deleted 필드의하는 deleted_date 필드를 가지고하는 것이 좋습니다. 당신은 대신 비트 필드의 추가 데이터의 멋진 조각을 얻는다.

    당신이 부드러운 삭제를 사용하려고하는 경우, 그것은 대신 is_deleted 필드의하는 deleted_date 필드를 가지고하는 것이 좋습니다. 당신은 대신 비트 필드의 추가 데이터의 멋진 조각을 얻는다.

  5. ==============================

    5.삭제 소프트의 주요 문제 중 하나는 원치 않는 데이터 것 잠재적으로 DB 성능에 영향을 미칩니다. 내 고객 중 하나 전에 몇 년은 모든 데이터베이스 항목에 대한 소프트 삭제 할 날을 요청, 그에게 내 솔루션 대신 현재 실행중인 테이블에 떠나는 백업 테이블에 모든 "삭제"항목을 이동하는 것입니다.

    삭제 소프트의 주요 문제 중 하나는 원치 않는 데이터 것 잠재적으로 DB 성능에 영향을 미칩니다. 내 고객 중 하나 전에 몇 년은 모든 데이터베이스 항목에 대한 소프트 삭제 할 날을 요청, 그에게 내 솔루션 대신 현재 실행중인 테이블에 떠나는 백업 테이블에 모든 "삭제"항목을 이동하는 것입니다.

  6. ==============================

    6.그것은 좋은 아이디어 때와 잘못된 삭제 절대적으로 치명적인이며, 경우 복구가 간단해야한다. 만약 당신이 "삭제"하고하고있다 모든 추적을 유지하려면 정말에만 의미 또한 좋은 아이디어이다 "숨기기." 의미, 그것은 상황까지입니다.

    그것은 좋은 아이디어 때와 잘못된 삭제 절대적으로 치명적인이며, 경우 복구가 간단해야한다. 만약 당신이 "삭제"하고하고있다 모든 추적을 유지하려면 정말에만 의미 또한 좋은 아이디어이다 "숨기기." 의미, 그것은 상황까지입니다.

  7. ==============================

    7.나는 "그것에 대해 정치적으로 올바른"일을 시도하지 않습니다. 당신이 옹호하는 경우가 뇌 검진을 위해 갈 필요가 다음 부드러운-삭제합니다.

    나는 "그것에 대해 정치적으로 올바른"일을 시도하지 않습니다. 당신이 옹호하는 경우가 뇌 검진을 위해 갈 필요가 다음 부드러운-삭제합니다.

    1) 첫째, 당신은 테이블의 행을 삭제하지 않음으로써 정확히 무엇을 달성하고? 미래에 언젠가는 당신이 권리를 해당 행에 액세스 할 수 있는지 그냥 사실? 그럼 왜 그냥 보관 표를 작성하지 거기 행을 이동? 그 문제는 무엇인가?

    2) 사용하면 약간의 타임 스탬프 열을 is_active 또는 쿼리에 대한 불필요한 쿼리를 작성하는 소프트 삭제합니다. 당신은 간단한 쿼리를 작성 될 때 그건 그냥 낭비된다. 네, 뷰와 함께 작동하지만 전망은 추가 부속물이 아니다? 모든 뷰가 추가 SQL이며, 추가 성능 비용은 아래로 아래에있는 상용 RDBMS의 모든 단지 테이블입니다. 당신이 테이블 위에 쿼리를 작성하는 방법을 모른다는 사실에서 떨어져 뷰에 대한 아무것도 마법이있다.

    3) 예, 그것은보기 또는 MV 작동합니다. 그러나 나는 FTS를하고 생산에 쿼리를 본 모든 것이 여전히 작동! 현대 하드웨어 및 고체 소프트웨어의 불가사의. 그러나 그 권리 중 하나를하지 않습니다. 그것이 작동하기 때문에 그래서 같은 논리에 의해, 그냥 오른쪽 의미하지 않는다

    4) 소프트 삭제의 복잡성은 결코 지금까지 간단한 선택을에서 멈 춥니 다.

    A)는 당신이 UNIQUE 제약 조건을 가지고 가정하자. 지금 당신은 행을 소프트 삭제하고 UNIQUE 제약 조건을 가진 열이 아직도있다. 당신이 동일한 데이터 등을 추가 할 때, 당신은 추가 "속임수"없이 그렇게 할 수 없습니다.

    B는) 당신은 표 B에 표 A에서가는 단체를 가지고 있습니다 당신은, 당신은 그 사실의 표 B 돌봐에 그 독립적 인 쿼리를 확인하기 위해 표 A에서 소프트 삭제 무언가를 필요로 할 때. 전형적인 세부 정보 페이지가 일부 detail_id에 일하는 가정하자.

    이제 master_id 소프트 삭제하지만 당신은 여전히 ​​사방이 master_id의 detail_id와 영구 링크가 있습니다. 당신이 master_id 하드 삭제 작업을 수행 할 때, 그 세부 사항은 단순히 존재하지 않습니다. 이제 소프트와 함께 그들은 여전히 ​​존재 삭제하고 그들의 master_id가 소프트 삭제 모드에 있다는 사실을 알고 있어야합니다.

    심플한 Table_A.is_active = 0 또는 1 단계에서 멈추지 않을 것이다.

    5) 하드 삭제를 수행하면 간단하고 권리입니다.

    A) 아무도 아무것도 추가 또는 아무것도 어디서나 걱정을 추가 할 수 없습니다.

    그냥 데이터 + 관련 조각을 보관하고 당신이 잘되어야합니다.

  8. ==============================

    8.소프트 삭제는 응용 프로그램에서 사용하는 데이터베이스 계정에서 DELETE 권한을 취소 할 수있다.

    소프트 삭제는 응용 프로그램에서 사용하는 데이터베이스 계정에서 DELETE 권한을 취소 할 수있다.

  9. ==============================

    9.언젠가 소프트 삭제가 필요합니다. 예를 들어, 송장 테이블을 참조하는 제품 테이블이 말한다. 특정 제품에 송장을 만든 후에는 해당 제품을 삭제하지 않을 수있다 (그리고 RI가 올바르게 설정되어있는 경우 그것은 당신을하지 않습니다).

    언젠가 소프트 삭제가 필요합니다. 예를 들어, 송장 테이블을 참조하는 제품 테이블이 말한다. 특정 제품에 송장을 만든 후에는 해당 제품을 삭제하지 않을 수있다 (그리고 RI가 올바르게 설정되어있는 경우 그것은 당신을하지 않습니다).

    이 특정 시나리오를 사용하면 실제 회사에서 당신은 아마 역사 재무 데이터를 삭제하지 것이다 송장을 삭제하고 싶지는 않을 것입니다 가정합니다.

    당신이 체인 이유로 사업 또는 기타에 대한 삭제 가능한없는 최대 종속성의 부작용으로 일부 데이터를 삭제 할 수 없을 것이다 많은 다른 경우가 있습니다 있지만.

  10. ==============================

    10.이 데이터에 따라 달라집니다. 일부 데이터 인해 법률 / 감사 요구 사항을 삭제할 수 없습니다.

    이 데이터에 따라 달라집니다. 일부 데이터 인해 법률 / 감사 요구 사항을 삭제할 수 없습니다.

    사회는, 예를 들어, 그렇지 않은 경우는 진짜 짜증이다 등의 연락처 정보, 사진, 메시지를 포함한 모든 관련 데이터와 계정을 삭제하는 옵션을 제공해야한다 반면에 네트워킹 사이트 페이스 북.

  11. ==============================

    11.당신은 당신이 만들어 recycle_bin 테이블에 기본 키를 추가하는 경우 오라클에, 다음 휴지통 의지에서 PK를 제거 행이 휴지통에있을 때 모든 쿼리의 값을 억제 할 수, 행 수준의 보안 정책을 추가 자동으로 모든 데이터를 복원합니다. 필요는 논리를 수용하는 다른 쿼리를 변경합니다.

    당신은 당신이 만들어 recycle_bin 테이블에 기본 키를 추가하는 경우 오라클에, 다음 휴지통 의지에서 PK를 제거 행이 휴지통에있을 때 모든 쿼리의 값을 억제 할 수, 행 수준의 보안 정책을 추가 자동으로 모든 데이터를 복원합니다. 필요는 논리를 수용하는 다른 쿼리를 변경합니다.

  12. ==============================

    12.삭제 된 행을 제외 할 수 있도록 쿼리 및 인덱스를 업데이트 할 필요가 있기 때문에,하지만, 비용이 함께 제공됩니다.

    삭제 된 행을 제외 할 수 있도록 쿼리 및 인덱스를 업데이트 할 필요가 있기 때문에,하지만, 비용이 함께 제공됩니다.

    어쩌면 대신 플래그를 전환의 또 다른 "휴지통"테이블로 이동합니다.

    또한, 하나는 단지 삭제를 다루고 있기 때문에 즉, 단지 부분적인 해결책이라고 할 수 있지만,이 행을 업데이트 할 때, 당신은 여전히 ​​이전 값을 덮어 쓰기합니다.

    당신이 정말 필요하지 않는 한 일반적으로, 나는 결코 삭제 아무 말 것. 디스크 공간이 싼 요즘이다. 물론, 한계가 있으며, 같은 테이블에 (아카이브 곳이 정말 그렇게 중요하지 않은 데이터, 그리고 어쩌면 당신은 온라인으로 이전 데이터를 보관할 필요가없는, 당신은 법적으로 삭제에 바인딩되는 데이터가 도) 작동합니다.

  13. ==============================

    13.그냥 센트를 추가 할 수 있습니다. 나는 항상 소프트 삭제; 아주 약간의 성능 비용 만 수행하지만. 고객이 그녀가 그녀가 기억하지 못하는 특정 작업을 수행 한 후 작동 중지 소프트웨어에 대한 불만을 비용에 대해 생각해보십시오. 음,이 지방의 예가 될 수 있지만, 당신은 무엇 예전 무엇을 나중에 삽입 있었는지, 누가했는지, 무엇이 잘못되었는지 모를 것이다. 이 경우이 편리 올 것입니다. 이 기능은 감사 목적, 그리고 이런 종류의 감사 보고서에 대한 많은 고객 요청에 대한 편리한 온다.

    그냥 센트를 추가 할 수 있습니다. 나는 항상 소프트 삭제; 아주 약간의 성능 비용 만 수행하지만. 고객이 그녀가 그녀가 기억하지 못하는 특정 작업을 수행 한 후 작동 중지 소프트웨어에 대한 불만을 비용에 대해 생각해보십시오. 음,이 지방의 예가 될 수 있지만, 당신은 무엇 예전 무엇을 나중에 삽입 있었는지, 누가했는지, 무엇이 잘못되었는지 모를 것이다. 이 경우이 편리 올 것입니다. 이 기능은 감사 목적, 그리고 이런 종류의 감사 보고서에 대한 많은 고객 요청에 대한 편리한 온다.

    또한, 대부분의 워크 플로우 기반의 응용 프로그램에서, 그것은 고객이 작업 항목에서 수행 된 "행동"에 관심이있는 소프트웨어 기능 / 요구 사항으로 온다; 어떤 값을 할당하고, 누가 처리 등

  14. ==============================

    14.나는 소프트 삭제의 팬이다. 주로 모두 삭제를 방지합니다. 그러나, 당신이 자식 객체를 선택하는 경우, 그것은 부모에 조인 그래서 코드를 추가합니다 (모든 부모를!) 그들의 확신 것도 삭제되지 않습니다 만들기 위해 객체. 또는 당신은 소프트 삭제를 단계적으로 할 수 있지만, 당신이 그들을 복원 할 경우 나중에는 아이들이 때문에 계단식으로 이미 삭제 된 삭제 된 알 수 없습니다.

    나는 소프트 삭제의 팬이다. 주로 모두 삭제를 방지합니다. 그러나, 당신이 자식 객체를 선택하는 경우, 그것은 부모에 조인 그래서 코드를 추가합니다 (모든 부모를!) 그들의 확신 것도 삭제되지 않습니다 만들기 위해 객체. 또는 당신은 소프트 삭제를 단계적으로 할 수 있지만, 당신이 그들을 복원 할 경우 나중에는 아이들이 때문에 계단식으로 이미 삭제 된 삭제 된 알 수 없습니다.

    또한, 나는 수정 누구인지 (또는 소프트 삭제)이 지난 그래서, 각 개체에 개정 날짜 시간 및 개정 이름을 유지합니다. 그리고 감사 추적, 나는 원래 테이블에 대한 모든 업데이트 후 삽입되는 * 역사 (CustomerHistory 같은) 테이블을 만듭니다. 객체가 수정 또는 소프트 삭제 한 후이 방법은, 내가 작업뿐만 아니라 객체의 마지막으로 알려진 상태를 수행하는 사람들의 기록을 가지고있다.

  15. ==============================

    15.나는 다음과 같은 다양한 시나리오 소프트 삭제가 발생했습니다 :

    나는 다음과 같은 다양한 시나리오 소프트 삭제가 발생했습니다 :

    CASE 1 : 사용자 / 코드가 표시되는 것을 레코드를 제거하지만, 기업이 그 기록을 가지고 알고에 관심이되므로 DB 수준에서 기록을 가지고있다. 이러한 요구 사항은 대부분 비즈니스에 의해 및 일반적으로 코어는 아마도 데이터베이스의 이전 기록을 가지고 & 만든 모든 변화에 대한 새로운 기록을 만들 수 (@joshperry & @armandino 시나리오와 같은) 법적 요구 사항입니다에서 구동된다. 그것이 isDeleted를 플래그를 가진 전에 요구 사항을 satifys 경우이 시점에서, 나는 CASE 2보고 및 평가 것

    CASE 2 : 감사 추적 레코드의 진화를 추적하기 - 괜찮은 기사의 톤은 데이터베이스 레코드의 감사 추적을 유지하기 위해 온라인이 있습니다

    HTH.

  16. from https://stackoverflow.com/questions/2549839/are-soft-deletes-a-good-idea by cc-by-sa and MIT license