Sổ sách kế toán kép là
một bộ quy tắc để ghi lại thông tin tài chính trong một hệ thống kế toán tài chính, trong đó mọi giao dịch hoặc sự kiện thay đổi ít nhất hai tài khoản sổ cái danh nghĩa khác nhau.
Tài khoản có thể được "ghi nợ" hoặc "ghi có" và tổng của tất cả các khoản tín dụng phải bằng tổng của tất cả các khoản ghi nợ.
Làm thế nào bạn sẽ thực hiện điều này trong cơ sở dữ liệu Postgres? Chỉ định DDL sau:
CREATE TABLE accounts(
account_id serial NOT NULL PRIMARY KEY,
account_name varchar(64) NOT NULL
);
CREATE TABLE transactions(
transaction_id serial NOT NULL PRIMARY KEY,
transaction_date date NOT NULL
);
CREATE TABLE transactions_details(
id serial8 NOT NULL PRIMARY KEY,
transaction_id integer NOT NULL
REFERENCES transactions (transaction_id)
ON UPDATE CASCADE
ON DELETE CASCADE
DEFERRABLE INITIALLY DEFERRED,
account_id integer NOT NULL
REFERENCES accounts (account_id)
ON UPDATE CASCADE
ON DELETE RESTRICT
NOT DEFERRABLE INITIALLY IMMEDIATE,
amount decimal(19,6) NOT NULL,
flag varchar(1) NOT NULL CHECK (flag IN ('C','D'))
);
Lưu ý: bảng giao dịch_details không chỉ định tài khoản ghi nợ / tín dụng rõ ràng, vì hệ thống sẽ có thể ghi nợ / tín dụng nhiều hơn một tài khoản trong một giao dịch.
DDL này tạo ra yêu cầu sau: Sau khi giao dịch cơ sở dữ liệu cam kết trên bảng giao dịch_details, nó phải ghi nợ và ghi có cùng số tiền cho mỗi giao dịch transaction_id
, ví dụ :
INSERT INTO accounts VALUES (100, 'Accounts receivable');
INSERT INTO accounts VALUES (200, 'Revenue');
INSERT INTO transactions VALUES (1, CURRENT_DATE);
-- The following must succeed
BEGIN;
INSERT INTO transactions_details VALUES (DEFAULT, 1, 100, '1000'::decimal, 'D');
INSERT INTO transactions_details VALUES (DEFAULT, 1, 200, '1000'::decimal, 'C');
COMMIT;
-- But this must raise some error
BEGIN;
INSERT INTO transactions_details VALUES (DEFAULT, 1, 100, '1000'::decimal, 'D');
INSERT INTO transactions_details VALUES (DEFAULT, 1, 200, '500'::decimal, 'C');
COMMIT;
Có thể thực hiện điều này trong cơ sở dữ liệu PostgreQuery không? Không chỉ định các bảng bổ sung để lưu trữ trạng thái kích hoạt.