복붙노트

[SQL] 소프트 삭제를 구현하는 가장 좋은 방법은 무엇입니까?

SQL

소프트 삭제를 구현하는 가장 좋은 방법은 무엇입니까?

순간 프로젝트에서 작업하고 우리는 사용자 (사용자 역할)의 대부분 부드러운 삭제를 구현해야합니다. 우리는 데이터베이스의 각 테이블에 is_deleted = '0'필드를 추가하기로 결정하고 특정 사용자 역할이 특정 기록에 삭제 버튼을 누르고 있으면 '1'로 설정합니다.

이제 미래의 유지 관리를 위해 각 SELECT 쿼리 = '1'is_deleted 어디 레코드가 포함되지 않도록해야합니다.

소프트 삭제를 구현하기위한 더 나은 솔루션이 있습니까?

업데이트 : 나는 또한 우리가 감사 데이터베이스가 있음을 유의 모든 테이블 트랙 변경 (필드, 이전 값, 새로운 값, 시간, 사용자, IP) / 응용 프로그램 데이터베이스 내의 필드.

해결법

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

    1.당신은 WHERE IS_DELETED = '0'절을 포함하는 뷰에 대한 쿼리를 모두 수행 할 수 있습니다.

    당신은 WHERE IS_DELETED = '0'절을 포함하는 뷰에 대한 쿼리를 모두 수행 할 수 있습니다.

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

    2.나는 삭제가 발생한 때의 날짜를 포함하는 deleted_at 열 향하다 것입니다. 그런 다음 삭제에 대한 무료 메타 데이터의 약간을 얻는다. deleted_at이 NULL이고 당신의 선택은 행을 얻기 위해

    나는 삭제가 발생한 때의 날짜를 포함하는 deleted_at 열 향하다 것입니다. 그런 다음 삭제에 대한 무료 메타 데이터의 약간을 얻는다. deleted_at이 NULL이고 당신의 선택은 행을 얻기 위해

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

    3.is_deleted 열을 갖는 것은 상당히 좋은 방법입니다. 이 오라클에 있으면 더 증가 성능 나는 is_deleted 열에 목록 파티션을 생성하여 테이블을 분할 권 해드립니다. 그런 다음 삭제하고 당신을 위해 투명있을거야하지만 삭제되지 않은 행은 물리적으로 다른 파티션에있을 것입니다.

    is_deleted 열을 갖는 것은 상당히 좋은 방법입니다. 이 오라클에 있으면 더 증가 성능 나는 is_deleted 열에 목록 파티션을 생성하여 테이블을 분할 권 해드립니다. 그런 다음 삭제하고 당신을 위해 투명있을거야하지만 삭제되지 않은 행은 물리적으로 다른 파티션에있을 것입니다.

    결과적으로, 같은 쿼리를 입력하면

    SELECT * FROM table_name WHERE is_deleted = 1
    

    오라클은 '파티션 가지 치기'를 수행에만 해당 파티션으로 본다. 내부 파티션은 다른 테이블이지만, 사용자로 당신을 위해 투명 :이 분할되지 않거나에 상관없이 전체 테이블이 선택되지 수 있습니다. 그러나 오라클은 필요 만 파티션을 조회 할 수 있습니다. 예를 들어, 당신이 is_deleted = 1 is_deleted = 0 100000 행 1000 개 행이 가정 및 is_deleted에 테이블을 분할 할 수 있습니다. 이제 조건을 포함하는 경우

    WHERE ... AND IS_DELETED=0
    

    오라클은 1000 행으로 파티션을 검색합니다. 테이블이 분할되지 않은 경우 101,000 행 (두 파티션)을 스캔해야합니다.

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

    4.가장 좋은 반응은, 슬프게도, 당신이 당신의 임시 삭제와 함께 달성하기 위해 노력하고 데이터베이스 당신이 내이를 구현에 따라 달라집니다.

    가장 좋은 반응은, 슬프게도, 당신이 당신의 임시 삭제와 함께 달성하기 위해 노력하고 데이터베이스 당신이 내이를 구현에 따라 달라집니다.

    SQL Server에서 최선의 해결책은 SMALLDATETIME 또는 DATETIME (필요한 단위에 따라 다름)의 유형으로 DELETED_ON / deleted_at 열을 사용하고 그 열 널 (NULL)을하는 것입니다. 그것이가 NULL이거나 열에 저장된 값을 확인하는 것보다 NULL NOT IS 수행 가장자리 빠른 그래서 SQL 서버, 행 헤더 데이터 테이블의 각 열에 대한 NULL 비트 마스크를 포함한다.

    당신은 많은 양의 데이터가있는 경우 인덱싱 된 뷰 통해서 데이터베이스 자체를 통해 또는 두 개의 테이블 (예를 들어, 제품 및 ProductHistory) 또는 통해 데이터를 분할 보길 원하는 것입니다.

    그들은 단지 의미의 한 조각을 가지고 있기 때문에 일반적으로 등, is_deleted, is_archive 같은 플래그 필드를 피할 수 있습니다. 널 (NULL) deleted_at는 archived_at 필드는 응용 프로그램을 상속 누구든지 자신과에 의미의 추가 수준을 제공합니다. 그들이 비트 마스크가 어떤 의미를 파악하기 위해 만든 방법에 대한 이해를 필요로하기 때문에 내가 전염병처럼 필드를 비트 마스크 마십시오.

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

    5.테이블이 크고 성능이 문제가되는 경우, 당신은 항상 기록을 삭제 삭제 시간과 같은 추가 정보를 가지고 다른 테이블,,, 등으로 기록을 '삭제'이동할 수 있습니다

    테이블이 크고 성능이 문제가되는 경우, 당신은 항상 기록을 삭제 삭제 시간과 같은 추가 정보를 가지고 다른 테이블,,, 등으로 기록을 '삭제'이동할 수 있습니다

    당신은 당신의 기본 테이블에 다른 열을 추가 할 필요가 없습니다 방법이 있음

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

    6.그것은 당신이 지원하려는 워크 플로우 무엇을 당신이 필요로하는 정보에 따라 달라집니다.

    그것은 당신이 지원하려는 워크 플로우 무엇을 당신이 필요로하는 정보에 따라 달라집니다.

    당신이 할 수 하시겠습니까 :

    레코드가 삭제 된 네 번 취소가 삭제 된 경우 그것이 않은 삭제 된 상태로 현재 알고, 또는 연속 사이의 편집을 포함하여 (중간에 무슨 일이 있었는지 말할 수있을 싶어하는 것은 충분하다 삭제!)?

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

    7.고유성 제약 조건 위반을 일으키는 소프트 삭제 된 레코드의주의. 당신의 DB 고유 제약 열이있는 경우, 이전 일시 삭제 된 레코드가 기록을 다시에서 당신을 방해하지 않도록주의하십시오.

    고유성 제약 조건 위반을 일으키는 소프트 삭제 된 레코드의주의. 당신의 DB 고유 제약 열이있는 경우, 이전 일시 삭제 된 레코드가 기록을 다시에서 당신을 방해하지 않도록주의하십시오.

    주기의 생각 :

    로그인 = JOE가 소프트 삭제 된 행에 이미 있기 때문에 두 번째 제약 조건 위반의 결과를 만들 수 있습니다.

    일부 기술 :  새 테이블에 삭제 된 레코드를 이동하십시오.  로그인을 가로 질러 및 타임 스탬프 열 deleted_at 당신의 고유성 제약 조건을 확인합니다

    내 자신의 의견은 새 테이블로 이동 한 것입니다. 의 그것 걸릴 많은     모든 걸쳐 * AND delete_at = NULL *을 유지하기 위해 훈련 당신의     쿼리 (개발자 모두를위한)

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

    8.짐 말한 것처럼 당신이 왜, 누구에 의해 삭제 될 때의 기록을 가지고뿐만 아니라, 다른 테이블에 삭제 된 데이터를 이동하는 경우 당신은 확실히 더 나은 성능을 제공합니다.

    짐 말한 것처럼 당신이 왜, 누구에 의해 삭제 될 때의 기록을 가지고뿐만 아니라, 다른 테이블에 삭제 된 데이터를 이동하는 경우 당신은 확실히 더 나은 성능을 제공합니다.

    모든 쿼리 = 0 삭제 곳에 추가하면 상당히을 천천히, 그리고 당신이 테이블에 미칠 수있는 인덱스의의 사용을 방해합니다. 가능하면 당신의 표에 "플래그를"필요하지 마십시오.

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

    9.당신은, 당신은 = 0 is_deleted 커버링 인덱스를 만들 수 있도록, 필터링 된 인덱스를 만들 수 있도록이 특정 방식의 네거티브 필름의 일부를 완화 어떤 제품을 언급하지만, SQL Server 2008 및 PostgreSQL을 (그리고 다른 사람은 내가 확신)하지 않는다 .

    당신은, 당신은 = 0 is_deleted 커버링 인덱스를 만들 수 있도록, 필터링 된 인덱스를 만들 수 있도록이 특정 방식의 네거티브 필름의 일부를 완화 어떤 제품을 언급하지만, SQL Server 2008 및 PostgreSQL을 (그리고 다른 사람은 내가 확신)하지 않는다 .

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

    10.뭔가 내가 프로젝트에서 사용하는 statusInd의 TINYINT 0 열을 기본 NULL이 아닌 비트 마스크 나 데이터 관리 (삭제, 아카이브, 복제, 복원 등)을 수행 할 수 있습니다로 statusInd를 사용. 보기에이를 사용하면 나는 그 소비 응용 프로그램 등, 출판, 데이터 분배를 할 수 있습니다. 성능이 전망에 대한 우려 경우, 사실 떨어지고,이 정보를 지원하기 위해 작은 사실 테이블을 사용, 관계을 삭제하고 scalled 삭제 수 있습니다.

    뭔가 내가 프로젝트에서 사용하는 statusInd의 TINYINT 0 열을 기본 NULL이 아닌 비트 마스크 나 데이터 관리 (삭제, 아카이브, 복제, 복원 등)을 수행 할 수 있습니다로 statusInd를 사용. 보기에이를 사용하면 나는 그 소비 응용 프로그램 등, 출판, 데이터 분배를 할 수 있습니다. 성능이 전망에 대한 우려 경우, 사실 떨어지고,이 정보를 지원하기 위해 작은 사실 테이블을 사용, 관계을 삭제하고 scalled 삭제 수 있습니다.

    키를 실시간 우려 350기가바이트 + DBS를 위해 - 아주 작은 데이터 공간을 유지 잘 저울이고 데이터 중심. 대안, 테이블, 트리거를 사용하여 필요에 따라하는 것은 또는 당신을 위해 작동하지 않을 수 있다는 약간의 오버 헤드를 가지고있다.

    감사 관련 SOX는 귀하의 경우 도움말을 더 필드 이상이 필요할 수 있습니다,하지만이 도움이 될 수 있습니다. 즐겨

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

    11.그래서 나는 여러 가지 CONFIGS에 사용할 수 있습니다, 상태 열을 유지하는 것을 선호 즉 출판, 개인, 삭제, needsAproval ...

    그래서 나는 여러 가지 CONFIGS에 사용할 수 있습니다, 상태 열을 유지하는 것을 선호 즉 출판, 개인, 삭제, needsAproval ...

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

    12.타 스키마를 생성하고 데이터 스키마에 모두 부여합니다. 새 스키마에 대한 Implment VPD는 각각의 모든 쿼리는가 추가 비 삭제 된 행의 선택을 허용하는 조건을 수 있도록. http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/cmntopc.htm#CNCPT62345

    타 스키마를 생성하고 데이터 스키마에 모두 부여합니다. 새 스키마에 대한 Implment VPD는 각각의 모든 쿼리는가 추가 비 삭제 된 행의 선택을 허용하는 조건을 수 있도록. http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/cmntopc.htm#CNCPT62345

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

    13.

    @AdditionalCriteria("this.status <> 'deleted'")
    

    당신의 @Entity의 상단에 넣어

    http://wiki.eclipse.org/EclipseLink/Examples/JPA/SoftDelete

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

    14.검사 = 0 is_deleted하는 도면, 함수, 프로 시저를 사용하여; 즉 테이블이 다른 이유로 나중에 변경해야하는 경우 테이블에서 직접 선택하지 마십시오.

    검사 = 0 is_deleted하는 도면, 함수, 프로 시저를 사용하여; 즉 테이블이 다른 이유로 나중에 변경해야하는 경우 테이블에서 직접 선택하지 마십시오.

    큰 테이블과 인덱스 is_deleted 열입니다.

    이미 감사 추적을 가지고 있기 때문에, 삭제 날짜를 추적하는 것은 중복입니다.

  15. from https://stackoverflow.com/questions/68323/what-is-the-best-way-to-implement-soft-deletion by cc-by-sa and MIT license