2010-11-19 4 views
2

어쩌면 나는 인터넷 검색에 능숙하지 않지만 금 관련 규칙을 설정하고 청구 관련 데이터베이스를 디자인 할 때 권장 사항을 찾고 있습니다.러닝 밸런스 및 데이터베이스 정규화 패러다임

는 내가 저장하고 모든 거래에 갱신의 아이디어를 포기 database normalization의 규정에 근거 거래

transactions(id int, credit float, debit float, billable_account_id int) 

과 SQL 테이블이 있다고 가정하자 같은에있는 모든 * billable_account_id *에 대한 실행 균형을 계산 사전 테이블 또는 트랜잭션 테이블의 크기에 관계없이 다른 곳에.

문제가 (주제가 일반적이지만) 나는 Postgres를 사용하고 있으며 SQL 닌자는 아예 설계하지 않으려 고 노력하고 있습니다.

질문 :

  1. 오전 나는 바로이 방법으로가는?
  2. 그렇다면 이러한 테이블을 유지 관리하고 합계 계산을 위해 쿼리를 작성하는 데 어떤 방법을 제안 하시겠습니까?

모든 참조는 매우 감사하겠습니다!

답변

1

분석 함수를 사용하여 대부분의 데이터베이스에서 누적 합계를 생성 할 수 있습니다. 오라클, 당신은 TRANSACTION_DATE이없는 경우

SELECT billable_account_id, 
     SUM((CASE WHEN credit IS NOT NULL THEN credit 
        WHEN debit IS NOT NULL THEN -1 * debit 
        ELSE 0 
        END)) OVER (PARTITION BY billable_account_id 
            ORDER BY transaction_date) running_total 
    FROM transactions 

같은, 당신은 당신이 생성 된 ID를 일정하게 증가하는 것을 보장 할 수 있다고 가정 ID를 사용할 수 있습니다.

그러나 성능 측면에서 볼 때 OLAP/DSS 유형보고에 대한 세 번째 정규화 정규화 규칙을 위반하지 않으면 사용자가 총계를 매우 자주보고하기를 원하기 때문에 구부리기를 원할 것입니다. 많은 거래를 할 가능성이있다. 예를 들어, 매월 마지막 BILLABLE_ACCOUNT_ID에 대한 잔액이있는 별도의 테이블을 만든 다음 분석 함수를 사용하여 지난 달의 거래를 지난 달의 잔액에 추가 할 수 있습니다. Oracle에서는 누적 합계를 자동으로 유지 관리하는 구체화 된보기를 생성하고자 할 수 있습니다.

+3

http://tech.jonathangardner.net/wiki/PostgreSQL/Materialized_Views –

+0

감사합니다. 당신이 내게 방향을 줬어! – forker