문제

과거 거래 데이터를 저장 해야하는 방법을 결정하려고합니다.

레코드가 매번 새로운 타임 스탬프로 다시 삽입되는 단일 테이블에 저장해야합니까?

히스토리 데이터를 별도의 '기록'테이블로 나누고 '활성'테이블에 현재 데이터를 유지해야합니다.

그렇다면 어떻게 최선을 다합니까? 데이터를 자동으로 히스토리 테이블에 복사하는 트리거로? 아니면 내 응용 프로그램에 논리가 있습니까?

Welbog의 의견에 따라 업데이트 :

많은 양의 역사적 데이터가있을 것입니다 (수십만 행 - 결국 수백만 행)

주로 검색 및보고 작업은 과거 데이터에서 실행됩니다.

성능은 관심사입니다. 검색은 결과를 생성하기 위해 밤새도록 실행할 필요가 없습니다.

도움이 되었습니까?

해결책

요구 사항이 전적으로보고를위한 경우 별도의 데이터웨어 하우스를 구축하는 것이 좋습니다. 이를 통해 역사적보고에 훨씬 더 좋지만 트랜잭션 시스템에서는 잘 작동하지 않는 천천히 변화하는 차원과 같은 데이터 구조를 사용할 수 있습니다. 결과 조합은 또한 성능 및 유지 보수 승리가 될 생산 데이터베이스에서 역사적보고를 움직입니다.

응용 프로그램 내 에서이 기록을 사용할 수 있도록이 기록이 필요하다면 일종의 버전화 또는 논리적 삭제 기능을 구현하거나 모든 것을 완전히 대조하고리스트로 만들어야합니다 (즉, 트랜잭션은 절대 삭제되지 않고 방금 반전 및 재조정됩니다). 당신이 당신 여부에 대해 매우 신중하게 생각하십시오 진짜 많은 복잡성을 추가하므로 이것을 필요로합니다. 역사적 상태를 올바르게 재구성 할 수있는 거래 응용 프로그램을 만드는 것은 외관보다 훨씬 어렵습니다. 금융 소프트웨어 (예 : 보험 인수 시스템)는 생각보다 훨씬 더 많은 일을하지 않습니다.

감사 로깅을 위해서만 기록이 필요한 경우 그림자 테이블을 만들고 감사 로깅 트리거를 만드십시오. 이는 응용 프로그램 내에서 감사 로깅을 올바르게 구현하는 것보다 훨씬 간단하고 강력합니다. 트리거는 또한 응용 프로그램 외부의 소스에서 데이터베이스 변경 사항을 선택합니다.

다른 팁

이 질문은 비즈니스 논리의 선을 따라갑니다. 비즈니스 요구 사항을 먼저 알고 거기서부터 시작하십시오. 데이터웨어 하우스는 이러한 종류의 상황에 대한 좋은 솔루션입니다. ETL은 데이터 흐름을 다루는 데 많은 옵션을 제공합니다. '역사'대 '활성'의 기본 개념은 매우 정확합니다. 모든 차원과 사실 테이블이있는 데이터웨어 하우스에 보관하면 기록 데이터가 더 효율적이고 유연합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top