基本 SQL 复式会计分类帐 - 如何拆分日记帐分录
Basic SQL double-entry accounting ledger - how to split journal entries
使用此 Gist 中的基本 SQL 模式:https://gist.github.com/NYKevin/9433376,如何创建拆分日记帐分录?
我明白为什么 entries
table 有一个单一的金额和指向要贷记/借记的账户的指针 - 这迫使复式输入保持一致并便于计算余额。
但这似乎使拆分日记帐分录变得不可能。简单的例子就是购买 1200 英镑的增值税:
1. Credit "Creditors control" account with £1200
2. Debit "VAT" account with £200
3. Debit "Purchases" account with £1000
一个更复杂的例子是工资单,其中有一个借方是工资支出,另一个是工资税支出的借方,以及现金和各种扣除账户的贷方。
这个 SQL 模式是否不足以满足这些目的,或者有没有办法使用 Gist 中的 SQL 来做到这一点?
你是对的,你的要点中的示例架构使得无法拆分日记帐分录。
您需要的是一个架构,每个单独的日记条目都有一行。这是一种更灵活的设计,可以适应您正在寻找的复杂场景。
例子
架构
我建议至少三个 table 来满足您的要求:
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
table 的一行和至少插入 journal
table 的两行,以及信用和这些行的借方必须平衡。
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
条目的总和是平衡的。
我可能还想定义某些类型的交易以及可以为这些交易类型记录哪些类型的帐户,具体取决于我的系统有多复杂或严格。
最后,我将创建规则、触发器或配置权限,以确保这些 table 中的行未被删除或更新。在这样的系统中,所有更正都应通过附加交易进行。
使用此 Gist 中的基本 SQL 模式:https://gist.github.com/NYKevin/9433376,如何创建拆分日记帐分录?
我明白为什么 entries
table 有一个单一的金额和指向要贷记/借记的账户的指针 - 这迫使复式输入保持一致并便于计算余额。
但这似乎使拆分日记帐分录变得不可能。简单的例子就是购买 1200 英镑的增值税:
1. Credit "Creditors control" account with £1200
2. Debit "VAT" account with £200
3. Debit "Purchases" account with £1000
一个更复杂的例子是工资单,其中有一个借方是工资支出,另一个是工资税支出的借方,以及现金和各种扣除账户的贷方。
这个 SQL 模式是否不足以满足这些目的,或者有没有办法使用 Gist 中的 SQL 来做到这一点?
你是对的,你的要点中的示例架构使得无法拆分日记帐分录。
您需要的是一个架构,每个单独的日记条目都有一行。这是一种更灵活的设计,可以适应您正在寻找的复杂场景。
例子
架构
我建议至少三个 table 来满足您的要求:
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
table 的一行和至少插入 journal
table 的两行,以及信用和这些行的借方必须平衡。
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
条目的总和是平衡的。
我可能还想定义某些类型的交易以及可以为这些交易类型记录哪些类型的帐户,具体取决于我的系统有多复杂或严格。
最后,我将创建规则、触发器或配置权限,以确保这些 table 中的行未被删除或更新。在这样的系统中,所有更正都应通过附加交易进行。