PostgreSQL을 사용하고 있지만 대부분의 최고급 DB에는 비슷한 기능이 있어야하며 그에 대한 솔루션이 나에게 솔루션을 불러 일으킬 수 있으므로이 PostgreSQL 전용을 고려하지 마십시오.
나는이 문제를 해결하려고 시도한 첫 번째 사람이 아니라는 것을 알고 여기에서 물어볼 가치가 있다고 생각하지만 모든 거래가 근본적으로 균형을 이루도록 회계 데이터를 모델링하는 비용을 평가하려고합니다. 회계 데이터는 추가 전용입니다. 여기에서 전체 제약 (의사 코드로 작성)은 대략 다음과 같습니다.
CREATE TABLE journal_entry (
id bigserial not null unique, --artificial candidate key
journal_type_id int references journal_type(id),
reference text, -- source document identifier, unique per journal
date_posted date not null,
PRIMARY KEY (journal_type_id, reference)
);
CREATE TABLE journal_line (
entry_id bigint references journal_entry(id),
account_id int not null references account(id),
amount numeric not null,
line_id bigserial not null unique,
CHECK ((sum(amount) over (partition by entry_id) = 0) -- this won't work
);
분명히 그러한 검사 제약 조건은 작동하지 않습니다. 행마다 작동하며 전체 db를 점검 할 수 있습니다. 따라서 항상 실패하고 속도가 느려집니다.
내 질문은이 제약 조건을 모델링하는 가장 좋은 방법은 무엇입니까? 기본적으로 지금까지 두 가지 아이디어를 살펴 보았습니다. 이것들이 유일한 것인지 또는 누군가 더 나은 방법이 있는지 궁금합니다 (앱 레벨 또는 저장된 프로 시저로 두지 않는 것).
- 나는 원고와 최종 출입 장 간의 차이에 대한 회계 세계의 개념에서 페이지를 빌릴 수 있었다 (일반 저널 대 총계정 원장). 이와 관련하여 이것을 분개에 첨부 된 분개 라인 배열로 모델링하고 배열에 대한 제약 조건을 적용 할 수 있습니다 (PostgreSQL 용어로 unnest (je.line_items)에서 sum (amount) = 0을 선택하십시오. 개별 열 제약 조건을보다 쉽게 적용 할 수 있고 인덱스 등이 더 유용한 광고 항목 테이블에 저장합니다.
- 일련의 0의 합계가 항상 0이라는 아이디어로 트랜잭션 당 이것을 강제하는 제약 조건 트리거를 코딩하려고 시도 할 수 있습니다.
나는 저장 프로 시저에서 논리를 적용하는 현재 접근 방식과 비교하여 이것들을 계량하고 있습니다. 복잡성 비용은 수학적 제약 증명이 단위 테스트보다 우수하다는 생각에 비추어지고 있습니다. 위의 # 1의 주요 단점은 튜플 유형은 PostgreSQL에서 일관성없는 동작과 가정의 규칙적인 변화가 발생하는 영역 중 하나이며,이 영역의 동작이 시간이 지남에 따라 변경되기를 바랍니다. 미래의 안전한 버전을 설계하는 것은 그리 쉬운 일이 아닙니다.
각 테이블에서 수백만 레코드까지 확장 할 수있는이 문제를 해결하는 다른 방법이 있습니까? 뭔가 빠졌습니까? 내가 놓친 트레이드 오프가 있습니까?
버전에 대한 Craig의 요점에 대한 응답으로 최소한 PostgreSQL 9.2 이상에서 실행해야 할 것입니다 (9.1 이상이지만 아마도 9.2로 계속 갈 수 있음).