总账建模的要点
总账域的事实是凭证分录行:一张凭证由一借一贷或多借多贷组成,每行挂科目、期间、组织、币种维度,借方金额与贷方金额分开存放。试算平衡是硬校验——同一张凭证内借方合计必须等于贷方合计,加载流程先过这道校验再放行。
基本信息
| 事实粒度 | 凭证分录行,凭证号加行号唯一 |
|---|---|
| 主要维度 | 科目、会计期间、组织、币种、经办人 |
| 度量 | 借方金额、贷方金额 |
| 硬校验 | 同一凭证借贷合计相等 |
| 派生表 | 科目余额表由分录汇总生成,与分录每日勾稽 |
典型使用场景
- 报表编制:按科目与期间汇总借贷发生额,出具资产负债表与利润表
- 余额追溯:从余额表下钻到明细分录,定位某笔余额的构成
- 月末结账:关账前跑试算平衡,不平衡不允许关账
- 费用分析:按组织与成本中心汇总费用类科目的发生额
- 审计抽样:按凭证号抽取分录,核对原始单据与账务一致性
分录事实表与平衡校验
分录事实表与平衡校验
-- 分录行:凭证号加行号唯一,会计期间作为分区
CREATE TABLE fact_gl_entry (
voucher_id string COMMENT '凭证号',
line_no int COMMENT '凭证行号',
account_sk bigint COMMENT '科目代理键',
org_sk bigint COMMENT '组织代理键',
dr_amt decimal(18,2) COMMENT '借方金额',
cr_amt decimal(18,2) COMMENT '贷方金额',
period string COMMENT '会计期间'
) PARTITIONED BY (period) STORED AS ORC;
-- 试算平衡:同一凭证借贷必须相等,不通过即阻断加载
SELECT voucher_id, sum(dr_amt) AS dr_sum, sum(cr_amt) AS cr_sum
FROM fact_gl_entry
WHERE period = '2026-10'
GROUP BY voucher_id
HAVING sum(dr_amt) <> sum(cr_amt);分录与余额的分工
| 对比项 | 凭证分录 | 科目余额 |
|---|---|---|
| 粒度 | 凭证行级 | 科目乘以期间 |
| 用途 | 追溯原始账务 | 报表直接取数 |
| 关系 | 汇总后生成余额 | 由分录推导,可反查 |
| 校验 | 同凭证借贷平衡 | 期末等于期初加发生额 |
科目版本变化要有对照表:科目表调整后,同比与趋势分析必须按对照关系还原,否则新旧科目混在同一列,同比直接断裂且无法解释。
凭证号加行号是唯一键,重复加载会让发生额虚增,加载前要按该键做去重或幂等覆盖,而不是依赖全量重跑。