您是对的,您的要点中的示例架构使得无法拆分日记帐条目。
您需要的是一个架构,每个日志条目都有一行。这是一种更灵活的设计,可以适应您正在寻找的复杂场景。
示例
架构
我建议至少三个表来满足您的要求:
CREATE TABLE account(
account_id serial PRIMARY KEY,
account_name text NOT NULL
);
CREATE TABLE financial_transaction (
financial_transaction_id serial PRIMARY KEY,
datetimestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
description text NOT NULL
);
CREATE TABLE journal(
journal_id serial PRIMARY KEY,
financial_transaction_id INTEGER REFERENCES financial_transaction(financial_transaction_id),
account_id INTEGER REFERENCES account(account_id),
amount NUMERIC(20, 2) NOT NULL,
is_credit boolean NOT NULL
);
帐户设置
我们将为您的示例创建三个帐户。尽管您可能不会对 id 进行硬编码,但我们在这里这样做是为了演示
INSERT INTO account (account_id, account_name) VALUES (1, 'Creditors control');
INSERT INTO account (account_id, account_name) VALUES (2, 'VAT');
INSERT INTO account (account_id, account_name) VALUES (3, 'Purchases');
购买交易示例
每笔金融交易仅涉及在financial_transaction 表中插入一行,在journal表中至少插入两行,并且这些行的贷方和借方之和必须平衡。
INSERT INTO financial_transaction (financial_transaction_id, description)
VALUES (1, 'Purchase of widget');
INSERT INTO journal (financial_transaction_id, account_id, amount, is_credit)
VALUES (1, 1, 1200, TRUE);
INSERT INTO journal (financial_transaction_id, account_id, amount, is_credit)
VALUES (1, 2, 200, FALSE);
INSERT INTO journal (financial_transaction_id, account_id, amount, is_credit)
VALUES (1, 3, 1000, FALSE);
注意事项
您可以看到这种结构如何轻松容纳拆分日记帐。结构可以轻松查询,交易或账户可以汇总用于不同目的。
如果我正在构建它,我可能会创建一个触发器,以在任何交易结束时强制执行它,它的贷方和借方 journal 条目的总和是平衡的。
我可能还想定义某些类型的交易以及可以为这些交易类型记录哪些类型的帐户,具体取决于我的系统的复杂程度或严格程度。
最后,我将创建一个规则、触发器或配置权限,以确保这些表中的行不被删除或更新。在这样的系统中,所有的更正都应该通过额外的交易来进行。