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.
sumber
Pendekatan lain adalah untuk mengadopsi posisi bahwa itu adalah transfer jumlah keuangan yang terdiri dari satu catatan.
Dengan demikian Anda mungkin memiliki struktur:
Batasan pemeriksaan dapat memastikan bahwa akun debit dan kredit berbeda, dan hanya ada satu jumlah untuk disimpan. Dengan demikian ada integritas yang terjamin, yang harus disediakan oleh model data secara alami.
Saya telah bekerja dengan sistem yang mengadopsi pendekatan ini dengan sukses. Ada sedikit efisiensi dalam query untuk catatan terhadap akun tertentu, tetapi tabel lebih kompak dan permintaan untuk akun sebagai debit saja atau karena kredit hanya sedikit lebih efisien.
sumber