'DeletedDate'와 같은 열이있는 테이블 행을 보는 데 익숙하지만 마음에 들지 않습니다. '삭제됨'의 개념은 처음부터 항목을 작성해서는 안된다는 것입니다. 실제로 데이터베이스에서 제거 할 수는 없지만 뜨거운 데이터와 함께 사용하고 싶지는 않습니다. 논리적으로 삭제 된 행은 누군가가 특별히 삭제 된 데이터를보고 싶어하지 않는 한 콜드 데이터입니다.
또한 작성된 모든 쿼리는 쿼리를 구체적으로 제외해야하며 인덱스도 고려해야합니다.
내가보고 싶은 것은 데이터베이스 아키텍처 수준과 응용 프로그램 수준에서의 변경입니다. 'deleted'라는 스키마를 만듭니다. 각 사용자 정의 테이블은 메타 데이터를 보유하는 여분의 필드 (테이블을 삭제 한 사용자)와 '삭제 된'스키마에서 동일하게 동일합니다. 외래 키를 만들어야합니다.
다음으로 삭제는 삽입 삭제가됩니다. 먼저 삭제할 행이 '삭제 된'스키마 대응 항목에 삽입됩니다. 그런 다음 기본 테이블에서 해당 행을 삭제할 수 있습니다. 그러나 추가 로직을 라인 어딘가에 추가해야합니다. 외래 키 위반을 처리 할 수 있습니다.
외래 키를 올바르게 처리해야합니다. 행을 논리적으로 삭제했지만 기본 / 고유 행이이를 참조하는 다른 테이블에 열을 갖는 것은 좋지 않습니다. 어쨌든 이런 일은 일어나지 않아야합니다. 정규 작업은 외부 키가 있더라도 기본 테이블에 다른 테이블에서 참조가없는 행을 제거 할 수 있지만 이는 비즈니스 논리입니다.
전반적인 이점은 테이블의 메타 데이터 감소 및 성능 향상입니다. 'deletedDate'열은이 행이 실제로 여기에 있지 않아야하지만 편의상 여기에두고 SQL 쿼리가 처리하도록합니다. 삭제 된 행의 사본이 '삭제 된'스키마에 보관 된 경우 핫 데이터가있는 기본 테이블은 핫 데이터의 비율이 높고 (적시에 아카이브 된 것으로 가정) 불필요한 메타 데이터 열이 줄어 듭니다. 인덱스 및 쿼리는 더 이상이 필드를 고려할 필요가 없습니다. 행 크기가 짧을수록 더 많은 행을 페이지에 맞출 수 있으며 SQL Server가 더 빠르게 작동 할 수 있습니다.
가장 큰 단점은 작업의 크기입니다. 추가 논리 및 오류 처리뿐만 아니라 하나 대신 두 개의 작업이 있습니다. 그렇지 않으면 단일 열을 업데이트하는 것보다 더 많은 잠금이 발생할 수 있습니다. 트랜잭션은 테이블에 대한 잠금을 더 오래 보유하며 두 개의 테이블이 관련됩니다. 적어도 내 경험상 프로덕션 데이터를 삭제하는 것은 거의 이루어지지 않습니다. 그럼에도 불구하고, 주요 테이블 중 하나에서 거의 1 억 개 항목 중 7.5 %가 'DeletedDate'열에 항목이 있습니다.
질문에 대한 답변으로 응용 프로그램은 '삭제 취소'를 알고 있어야합니다. '삭제 된'스키마의 행을 기본 테이블에 삽입 한 다음 '삭제 된 스키마의 행을 삭제하십시오. 오류, 외래 키 문제 등을 피하기 위해 몇 가지 추가 논리 및 오류 처리가 필요합니다.