会計伝票データのベストプラクティス
会計系データは「後で説明できること」が最重要です。一般業務テーブルと違い、削除や上書きよりも監査可能性を優先した設計が必要です。
基本原則
- 伝票明細は 不変(immutable) として扱う
- 誤り修正は削除ではなく 訂正仕訳(逆仕訳 + 正仕訳) で行う
- 誰が・いつ・なぜ修正したかを証跡として残す
赤黒追記(削除禁止)
誤伝票を直接 UPDATE/DELETE せず、逆符号の仕訳を追加して相殺します。
-- 元伝票(誤り)
伝票ID: J1001
借方: 売掛金 10000
貸方: 売上高 10000
-- 訂正1: 逆仕訳(赤)
伝票ID: J1002
借方: 売上高 10000
貸方: 売掛金 10000
-- 訂正2: 正しい仕訳(黒)
伝票ID: J1003
借方: 売掛金 12000
貸方: 売上高 12000
この方式なら、履歴を消さずに最終残高を正しくできます。監査時に「なぜこの数値になったか」を追跡可能です。
推奨スキーマ
伝票ヘッダ(
伝票ID PK,
伝票日付,
伝票種別,
訂正元伝票ID NULL,
登録者ID,
登録日時
)
伝票明細(
伝票ID FK,
行番号,
借貸区分, -- 借方/貸方
勘定科目ID,
金額,
摘要,
PRIMARY KEY (伝票ID, 行番号)
)
訂正元伝票ID を持たせると、どの伝票の訂正かを辿れます。
物理削除は原則禁止し、取り消しも新規伝票で表現します。
整合性制約
- 1伝票内で「借方合計 = 貸方合計」を必須にする
- 確定済み伝票の UPDATE/DELETE を禁止する
- 会計期間締め後は追加仕訳のみ許可する
- 重複登録防止のため idempotency key を導入する
他ドメインのベストプラクティス
会計以外でも「履歴が重要な業務」は、同じ発想で設計すると品質が上がります。
受注・請求データ
- 確定後の受注金額は上書きせず、訂正レコードで差分管理する
- 請求書は発行後に更新せず、取消 + 再発行で表現する
- 外部連携(二重送信)対策として idempotency key を必須化する
在庫データ
- 在庫数を単一列で直接更新し続けるだけにしない
- 入庫・出庫・調整を「在庫移動履歴」として append-only で保持する
- 現在在庫は履歴集計またはスナップショットで算出する
顧客マスタ・契約マスタ
- 重要属性(顧客区分、契約プラン)は有効期間を持って履歴管理する
- 削除ではなく「無効化 + 終了日」で管理し、過去参照可能にする
- 参照先は自然キーでなく不変IDで管理する
承認・監査ログ
- 誰が・いつ・何を・なぜ変更したかを必須で残す
- アプリログだけでなく、DB上でも監査列を保持する
- 運用者操作も同じ監査対象として記録する
運用ベストプラクティス
- 入力: 下書き状態で作成し、確定後に不変化する
- 修正: 訂正伝票を発行して履歴連結する
- 監査: 変更理由・実行者・承認者を必須記録する
- 検索: 残高は明細の集計で再現可能にする
「会計伝票を直接更新できる設計」は短期的には便利でも、監査・障害解析・法令対応で大きなリスクになります。会計領域は append-only を標準にしてください。