2009-11-23 2 views
2

데이터베이스 디자인과 관련된 질문이 있습니다. 으로 작업하고있는 데이터베이스는 데이터가 물리적으로 결코 삭제되지 않도록 어떤 방식 으로든 처리해야합니다. "DeleteDateTime"열을 일부 테이블에 추가하는 경로가 시작되었는데 기본적으로 NULL이지만 스탬프를 지정하면 삭제 된 레코드로 표시됩니다.SQL Server (2005) - DATETIME 및 인덱싱에서 "Deleted On"

이 방법을 사용하면 데이터를 쉽게 보관할 수 있지만 몇 가지 영역, 특히 의 경우 어둠 속에서도 이것이 모범 사례와 함께 고려되는지 여부와 이러한 테이블을 효율적으로 인덱싱하는 방법에 대해 생각할 수 있습니다.

"SiteID"와 "CourseID"열로 구성된 복합 기본 키가있는 "Courses"테이블이 있습니다. 이 테이블에는 위의 설명에 따라 사용되는 "DeleteDateTime"이라는 열이 있습니다.

SQL Server 2005와 호환되어야하므로 SQL Server 2008에서 필터링 된보기 기능을 사용할 수 없습니다. 이 테이블의 클러스터 된 인덱스에 "DeleteDateTime"을 포함해야합니까? 그렇다면 색인의 첫 번째 열 (예 : "DeleteDateTime, SiteID, CourseID") ...

이 접근 방식을 따라야하는 이유는 무엇입니까?

감사합니다.

+0

DATETIME 필드와 BIT 필드를 함께 사용하는 것은 삭제 작업이 언제 발생했는지 알기 때문에 중요합니다. –

답변

3

"죽은"레코드를 별도의 테이블로 옮길 수 있습니까? 예 : Courses 테이블의 경우 동일한 구조의 Courses_deleted 테이블 또는 이와 유사한 테이블이 있어야합니다.

레코드를 "삭제"하면 기본적으로 레코드를 "데드 테이블"로 옮깁니다. 이렇게하면 실제 현재 데이터의 인덱스가 작고 지루하게 유지됩니다.

집계 뷰가 필요한 경우 항상 두 테이블을 결합하는 Courses_View을 정의 할 수 있습니다.

귀하의 실제 테이블에 인덱스가 아니라, 작은 정적 및 상수 수 있어야 클러스터, 그래서 나는 확실히 그것으로 같은 날짜 시간 열을 가하고 권장하지 것이다. 별로 좋은 생각이 아닙니다. 좋은 클러스터링 키를 선택하고 무엇이, 킴벌리 트립의 블로그 항목을 확인하는 방법에 대한 좋은 정보를 들어

:

마크

+0

마크, 나는 오래된 기록을 "역사"테이블 또는 데이터베이스로 옮기는 것에 대해 조금 생각했습니다. 나의 주요 관심사는 막연한 것이지만, 유지하는 데 더 많은 자료가 될 것이라는 점입니다. 그것은 또한 내 "라이브"테이블과 같은 내 FK를 내 기록 테이블에 적용해야하는지와 같은 질문을 제기합니다. Kim Tripp의 블로그에 대한 링크를 제공해 주셔서 감사합니다. 그녀는 환상적인 자원입니다. –

+0

@ Justin : 네, 물론 - 테이블을 두 부분으로 나누어야 할 경우 - 활성 및 삭제 - 더 많은 작업이 필요합니다. 같은 장소에 모든 것을 보관하는 것이 더 쉽습니다. 어쩌면 활성 레코드 (SELECT (fields) .... Where DeleteDateTime IS NULL) 만 보여주는 테이블 상단에보기를 작성해야할까요? 어쩌면 이미 문제를 해결하기에 충분할 것입니다 .... –

2

what 's yourme 데이터 보존에 대한 nts? 데이터베이스에있는 모든 비 현재 데이터를 유지하는 대신 감사 로그를 조사 했습니까?

"DeleteDateTime"열을 포함하여 복합 색인의 머리글에 맞다고 생각합니다.

+0

차드 (Chad) 감사 로그 물건에 대해 조사해야 할 것입니다. 감사. –

+0

@ Justin : SQL Server에 대한 감사 트리거를 생성하는 데 CodeSmith가 유용하다는 것을 발견했습니다. 행운을 빌며 – Chad

+0

@Chad, codesmith 감사 로그 생성기에 대한 예가 있습니까? 나는이 [http://www.codeproject.com/Articles/10063/CodeSmith-generated-Audit-Log-Triggers]을 보았지만 아무 것도 유용하지 않다. –

0

나는이 내가 테이블에 내 모든 쿼리를 사용하는 것이 무엇 기본적으로

select {List all columns except the delete flag} 
from mytable 
where deletflag is null 

이다보기를 만들 것입니다. 이유는 사람들이 삭제 된 깃발을 고려하는 것을 잊지 않도록하는 것입니다. SQL Server 2005는 이러한 종류의보기를 쉽게 처리 할 수 ​​있으며 레코드를 삭제하는 데이 디자인을 사용하려는 경우 필요합니다. delted 컬럼에 별도의 인덱스가 있습니다. 클러스터 된 인덱스의 일부로 만들지는 않을 것입니다.

+0

뷰를 사용하여 원시 데이터를 추상화하는 것은 분명히 고려해야 할 사항이다. 하지만 실제로 내 질문의 색인 부분을 다루지는 않습니다. 뷰를 인덱싱 할 수 있다고 가정합니다. 모든 참여에 "with (noexpand)"를 사용하면 개발자가 기억해야 할 또 하나의 영역으로 들어가고 있습니다. "DeleteDateTime IS NULL"과 같은 문제 ... –