Pembukuan entri ganda adalah
seperangkat aturan untuk mencatat informasi keuangan dalam sistem akuntansi keuangan di mana setiap transaksi atau peristiwa mengubah setidaknya dua akun buku besar nominal yang berbeda.
Akun dapat "didebit" atau "dikreditkan", dan jumlah semua kredit harus sama dengan jumlah semua debit.
Bagaimana Anda menerapkan ini dalam database Postgres? Menentukan DDL berikut:
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'))
);
Catatan: tabel transaction_details tidak menentukan akun debit / kredit eksplisit, karena sistem harus dapat mendebit / kredit lebih dari satu akun dalam satu transaksi.
DDL ini menciptakan persyaratan berikut: Setelah transaksi database dilakukan pada tabel transaction_details, itu harus mendebit dan mengkredit jumlah yang sama untuk masing-masing transaction_id
, misalnya :
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;
Apakah mungkin untuk mengimplementasikan ini dalam database PostgreSQL? Tanpa menentukan tabel tambahan untuk menyimpan status pemicu.