2012-05-22 2 views
0

저는 Asp.net Mvc의 카드 관리 응용 프로그램을 만들고 있습니다. 우리는 Fluent Nhibernate를 ORM 및 Sql Server 2008로 사용하고 있습니다.기록 또는 재사용을 위해 삭제 된 데이터 보관

사용자가 데이터 삭제를 선택할 때 실제로 데이터를 삭제하지 않을 것을 고려 중입니다.

제 궁금한 점은 무엇이 가장 좋은 방법인지, 그리고 그 결과는 무엇입니까 (성능, DB 크기)?

우리 데이터베이스의 중요한 테이블에는 수천 개의 레코드가있을 수 있습니다. 사전에

감사합니다.

답변

2

외래 키가 관련되어있을 때 특히 좋은 생각이라고 생각하지 않았습니다. 이것은 실제로 상황을 더 복잡하게 만들 수 있습니다. 삭제 된 레코드가 실제로는 삭제되지 않는다는 아이디어는 결코 마음에 들지 않았습니다. 이것은 단지 지저분한 일입니다.

삭제 된 행을 보관하려면 일종의 보관 또는 기록 테이블에 저장하는 것이 좋습니다. 필요한 경우 나중에 분석 할 수 있도록 해당 방법을 제공합니다. 필요한 경우 나중에 다시 가져올 수 있습니다.

데이터베이스의 크기는 실제로 문제가되지 않습니다. "수천"의 레코드는 SQL Server를위한 것이 아닙니다. 제조 데이터베이스에는 테이블의 일부에 수억 개의 행이 있습니다. 성능이 우수합니다.

SQL Server 2008을 사용하면 Change Data Capture을 사용할 수 있으므로 삭제 된 행을 매우 효율적으로 처리 할 수 ​​있습니다.

+0

Hi Randy Minder, SQL Server 'Change Data Capture'를 사용하는 것과 동일한 첫 번째 제안 사항 (보관 또는 기록 테이블에 데이터 보관)이 있습니까? – Djaved

+0

@Djaved - 본질적으로 그렇습니다. CDC를 사용하면 아카이브 (기록) 테이블에서 삭제 된 행을 가져 오는 한 가지 방법입니다. –

+1

엔티 베이트 (삭제 된 레코드들)의 개정 정보를 추적하는 NHibernate 확장 인 Envers를 살펴볼 수도 있습니다. 엔티티에 속성으로 감사를 표시하거나 유창한 인터페이스를 사용하여 별도의 히스토리 테이블에서 자동 감사를 활성화하면됩니다. NHibernate처럼 모든 데이터베이스에서 작동합니다. [여기] (https://bitbucket.org/RogerKratz/nhibernate.envers)에서 찾을 수 있습니다. – rumpelstiefel

0

나는 삭제 트리거 (또한 성능 저하가 있음)를 만들고 아카이브 테이블에 삭제 된 행을 삽입합니다. 그런 다음 가능한 파티션/데이터 압축 테이블 (enterprice 버전의 SQL Server를 사용하는 경우).

아카이브 테이블은 일부 추가 ID 열이있는 것을 제외하고는 기본 테이블처럼 보이며 데이터를 삭제 한 삭제 날짜와 사용자 이름도 넣습니다.

+0

안녕하세요 Janis, '파티션/데이터 압축'은 무엇을 의미합니까? 저 한테 그 예를 들려 주시겠습니까? 감사 – Djaved

1

내가 지금 일하면서 이전 위치에서 아이디어는 언제나 기록상에 DeletedDateDeletedBy을 중심으로 조정되었습니다. 그렇게하면 정보를 검색 할 때마다 필터를 제거하고 레코드 만 가져올 수 있습니다. DeletedDate == null.

이렇게하면 DeletedDate을 null로 재설정하여 누가 데이터를 삭제했는지 추적하는 방법을 제공하고 삭제 내용을 "되돌릴"수 있습니다.

성능 및 데이터베이스 크기면에서 SQL Server는 수백만 행의 데이터를 처리 할 수있는 능력보다 훨씬 많은 것을 염려하지 않을 것입니다.

성능이 절대적으로 중요하고 응용 프로그램의 속도가 느려지는 경우 삭제 된 데이터를 별도의 백업 데이터베이스에 쉽게 보관할 수 있습니다.

데이터를 너무 오래 유지하는 데 신경 쓰지 않는다면 1 년 전 DeletedDate의 데이터베이스에있는 모든 항목을 주기적으로 삭제할 수 있습니다.

관련 문제