2012-11-14 3 views
1

현재 데이터베이스에서 가져온 막대한 양의 정보를 집계하는 응용 프로그램에 "보고서"를 구현 중입니다. 테이블의 각 셀은 다른 테이블의 합계에서 가져옵니다.
보고서에는 항상 사용자에게 최신 데이터가 표시되어야합니다. 각 데이터는 소프트웨어의 어느 곳에서나 바뀌므로 보고서가 최신 상태 여야합니다.데이터베이스 트리거가이 비즈니스 로직과 함께 사용할 수있는 방법입니까?

너무 많은 SQL이 생성됩니다.

중간 결과와 테이블을 캐싱하려고했습니다 (DB에서). 하지만 데이터가 변경 될 수있는 앱의 어느 곳에서든지 recomputeCache()으로 끝나는 캐시를 다시 계산해야합니다 (절대 최신 보고서를 유지해야 함). 일할 수있는

DBMS 트리거 : 다음을 계산하는 트리거를 보유하고 다음 하나를 계산 테이블에 트리거 등
하지만 트리거 두려워 :

  • 무엇 복잡성에 대해? 컴퓨팅을 수행하는 코드는 상당히 크고 "스마트"합니다. 구문 행 설탕으로 가득 찬 .NET 200 라인은 PL/SQL 500 개가됩니다.
  • 유지 관리 가능성은 어떻습니까? PL/SQL을 찾기, 읽기, 이해하기, 수정하기, 디버그하기 등의 작업이 더 힘들지 않습니까?
  • 비즈니스 로직 캡슐화는 어떻게됩니까? 이 컴퓨팅이 비즈니스 로직 계층에 속해서는 안됩니까?

나는 나 "전형적인"소프트웨어 캐싱 사이에서 선택을 (내가 스마트 캐시 재 계산 전략을 찾기 위해 노력하겠습니다) 도움이 조언을 듣고 있어요 테이블 재 계산을 트리거 기반 (그리고 어쩌면 소프트웨어 모범 사례를 희생하고 유지?) ...

고마워요!

+0

자동 업데이트와 함께 구체화 된보기를 사용할 수 있습니까? –

답변

0

보고서의 경우 먼저보기를 사용하려고합니다. 뷰는 기본 테이블의 최신 데이터를보기 만하면 항상 업데이트됩니다. 이렇게하면 복잡성과 당신이 지적한 방아쇠와 관련된 두통을 줄일 수 있습니다.

예 :보기의 성능이 충분하지

CREATE VIEW report AS 
SELECT 'sales' AS name, (SELECT sum(sales) FROM sales) AS value 
UNION ALL 
SELECT 'expenses' AS name, (SELECT sum(expenses) FROM expenses) AS value 

경우에, 당신이 실제로 트리거로보고 모든 레코드를 다시 읽어하지 않고 총을 집계 똑똑하게 될 수 있습니다. 하지만 먼저 가장 간단한 방법으로 의견을 제시 할 것입니다.

+0

뷰를 정의하는 쿼리는 매번 실행하기에는 너무 길지만 Vaibhav Desai가 말한 것처럼 구체화 된 뷰는이를 해결할 수 있습니다. 그래도 엄청난 양의 데이터가 많아서 하나의 SQL 쿼리로 작성할 수 있을지 모르겠습니다. 나는 그것을 파고들 것이다, 고마워. –

관련 문제