銀行システムの基本概念
銀行で使われる言葉を、一般的な意味とMinibankの実装に分けて整理します。
銀行ビジネスと主要商品を、利用者・銀行・会計の視点から理解する。
先に学ぶ内容 — Prerequisite: 基礎学ぶこと — LEARNING GOALS
このページで学ぶこと
- 顧客・口座・残高の関係
- 取引と台帳の違い
- 監査と照合が必要な理由
体験11 · BANKING(銀行システムの基本概念)
「残高が合うこと」だけで銀行は信用されるか確かめよう
まずは予想をひと言。本文を読んだ後、実際の画面と会計上の記録を見比べます。
- 01まず予想する — PREDICT
まずここだけ:思ったことをひと言書く
銀行システムで最も重要なのは、「残高が合っていること」だけでしょうか?
正解でなくて大丈夫です。「〜だと思う」から始めてみましょう。
ヒント1を見る
「残高が合っている」ことと、「なぜその残高になったか説明できる」ことは、同じでしょうか?
ヒント2を見る
誰が操作したかを記録することは、残高の正しさとは別の話でしょうか?
もっと詳しく:この問いで使う専門用語
- 顧客・口座・取引は、それぞれ別の役割を持つ業務オブジェクトです。
- 残高は現在値、台帳はそこへ至る全履歴です。
- 監査は、誰が・いつ・何をしたかを追跡する記録です。
- 照合は、別々に作られた記録が一致しているかを後から確認する作業です。
日常語で理解する — PLAIN LANGUAGE
まず、ここだけつかむ
銀行システムは『誰のお金か』『いくら動いたか』『なぜ動いたか』を別々の記録で管理し、それらが一致することを確かめます。
画面の残高は便利な表示ですが、正式な根拠は台帳に積み上がった仕訳です。監査は操作した人を、照合は記録同士の不一致を調べます。
Minibankは学習用にJPYの普通預金と同期処理へ範囲を絞っています。実在銀行の全機能を再現したものではありません。
順番に理解する — DIFFICULT PARTS, STEP BY STEP
難しいポイントを、順番にほどく
専門用語を覚えることより、「なぜ必要か」「このシステムのどこで使うか」を理解することが目標です。
顧客・口座・取引
顧客は契約する人、口座はお金を管理する契約単位、取引は入出金や振込という出来事です。
人と口座と出来事を同じものにすると、複数口座や履歴、凍結状態を正しく表せません。
customers、bank_accounts、transfersやfinancial_operationsを分けています。
残高と台帳
残高は現在値、台帳はそこへ至る全履歴です。
現在値だけでは、いつ・なぜ・どの取引で変わったかを説明も再計算もできません。
ledgerの仕訳を正とし、bank_accounts.cached_balanceは表示を速くする再構築可能な値です。
監査
誰が、いつ、何をしたかを追跡する記録です。
不正操作や事故の原因を調べ、説明責任を果たすために必要です。
行の変更差分と、重要な業務操作のbusiness eventをaudit schemaへ記録します。
照合
別々に作られた記録が一致しているかを後から確認する作業です。
制約だけでは、過去の不具合や運用ミス、想定外の経路による異常をすべて防げません。
reconciliation.run_check()が台帳・残高・業務記録などを検査します。
発展 — ADVANCEDもっと詳しく確認する最初の学習では読まなくても問題ありません。仕組みをもっと深く理解したい場合に開いてください。
利息は商品別に実装状況を区別する
定期満期の利息は、v15以降に開いた契約では、契約時に固定した年利(interest_rate_bps)と、開始日から満期日までのJST暦日数で、利息=floor(元本×年利bps×日数÷(10,000×365))と計算します。v15より前の契約は従来の式(日数=(maturity_date−opened_at)の秒数/86400、利息=floor(元本×interest_rate_bps/10000×期間日数/365))のままです。元本はTIME_DEPOSITS_PAYABLEの借方、正の利息はINTEREST_EXPENSEの借方、元利合計は普通預金負債の貸方です。端数切捨てで利息0なら利息行を作りません。これは満期処理のコードであり、自動batch稼働や本番適用の確認ではありません。
| 対象 | Implementation Status | 範囲 |
|---|---|---|
| 普通預金利息 | IMPLEMENTED IN MINIBANK | v15:版付きの金利と日次残高から、管理責任者が期間を指定して計算・支払う。自動の日次バッチではない |
| 定期預金の満期利息 | IMPLEMENTED IN MINIBANK | mature_time_depositで元本と利息を普通預金へ入金。税引前の単利。v15以降は契約時の価格を固定 |
| 貸出利息 | IMPLEMENTED IN MINIBANK | v14:個人向けの学習用融資の日割利息、返済予定、未収利息から元本への充当。法人融資・繰上返済・貸倒引当なし |
| 税・営業日・複雑な商品計算 | NOT IMPLEMENTED IN MINIBANK | 税控除、商品別day count/複利、営業日調整を実装済みとは扱わない |
業務オブジェクト
| 概念 | 一般的な意味 | Minibank |
|---|---|---|
| Customer | 契約主体となる顧客 | auth.usersと1対1のcustomers |
| Bank Account | 資金を保有・移動する口座 | JPY普通預金、顧客1人1口座 |
| Balance | 利用可能な金額 | ledgerが正、cached_balanceは再構築可能な表示用cache |
| Transfer | 口座間の資金移動 | transfersと2本のjournal lineを同一transactionで作成 |
| Deposit / Withdrawal / Fee | 入金・出金・手数料 | 管理者向けwrapperからcore関数を呼ぶ |
記録と検証
| 概念 | 目的 | Minibank |
|---|---|---|
| Ledger | 金額変動の根拠を残す | journal_entriesとjournal_lines |
| Audit | 誰が何をしたか追跡する | trigger差分とbusiness event |
| Reconciliation | 業務記録と会計記録を照合する | reconciliation.run_check() |
| Integrity Check | あり得ない状態を検出する | 残高、仕訳、逆仕訳、管理者状態などを検査 |
実際のMinibankでは
実在銀行の勘定系を完全再現したものではなく、JPY・普通預金・定期預金の満期利息・同期完了型の取引を扱う学習用モデルです。外部決済網、普通預金利息・貸出利息、AML、不渡り、営業日処理などは現時点のコードからは確認できません。
体験学習の続き · LEARNING LOOP
ここまで読めましたか?続けて確認してみましょう
銀行システムの基本概念を読んだところで、実際の画面と会計上の記録を見比べ、自分の言葉で説明してみます。
- 02実際に観察する — OBSERVE
同じ仕組みを、動く画面から観察する
まず顧客画面を開いて観察し、この教材へ戻ります。リンクは新しいタブで開きます。ログインが必要です。
アカウントがない場合は新規登録が必要です。本人確認・口座開設には管理者承認が必要です。承認前や操作できない場合も、この教材内の図・説明・Source Trail(教材の参照元)で代替学習し、次へ進めます。
ログイン・新規登録の入口を開く ↗操作できない場合:教材の参照元で確認する ↓もっと詳しく:管理者の画面で観察する
管理者ログインが必要です。権限がない場合は、次の「証拠を確認する」の教材による確認で進められます。
- 03証拠を確認する — EVIDENCE
何を見たか、1つずつ確かめる
Evidence(判断の根拠となる記録)を確認したらチェックします。各項目の「何を見るか」を手がかりにしてください。
画面を開けない項目は、Source Trail(教材の参照元)と教材の説明で確認できます。失敗を実際に起こす必要はありません。
- 04コードの処理経路を追う — CODE TRAIL
コードを書く必要はありません
ここでは「説明されている仕組みが、実際のMini Bankのどこに実装されているか」を確認します。まずは日本語の役割説明を読み、入力した依頼がどこへ渡るかをつかみましょう。コードの全文を読む必要はありません。
基本の順序は、画面 → API Route(依頼を受ける窓口)→ TransferService(処理をつなぐサービス)→ DB / RPC(記録の保存場所と、その処理の呼び出し)です。まず最初の2つを見て、続くサービスは「もっと詳しく」で確認します。
教材の参照元を確認する — Source Trail ↓顧客モデルを作る定義。顧客と口座がどう分かれているかを探します。
supabase/migrations/20260819124148_create_customers.sqlMigration(DB定義の変更履歴)。口座と残高cacheの定義を確認します。
supabase/migrations/20260819124248_create_bank_accounts.sql - 05自分の言葉で説明する — EXPLAIN
LEVEL 1 — やさしい説明(まずここだけ)
銀行システムにおいて、なぜ「残高が正しいこと」だけでは信用を得られないのでしょうか? 短い2文を目安に説明してください。
日常語だけで完了できます。専門用語の数や正誤を自動採点するものではありません。
ヒント1を見る
「記録」と「監査」という2つの言葉を使って書いてみましょう。
ヒント2を見る
残高が合っていても足りないものがあるとしたら何か考えてみましょう。
もっと詳しく:LEVEL 2 — 専門用語を使った説明(任意)
顧客・口座・取引、残高と台帳、監査、照合の4つを使って、銀行システムが守るべきことを説明してみましょう。
挑戦する場合は、上の説明欄に追記できます。追加しなくても完了できます。
説明の確認ポイント — Checkpoint- 残高の正しさと、記録の説明可能性が別だと説明できる
- 監査と照合が異なる役割を持つと説明できる
理解を確かめる — CHECK YOUR UNDERSTANDING
3問で理解チェック
答えを頭の中で考えてから、各項目を開いて確認してください。
Q1残高と台帳は同じものですか?
違います。残高は今いくらかという結果、台帳はその結果になった根拠の履歴です。
Q2監査と照合の役割の違いは?
監査は主に誰が何をしたか、照合は主に複数の記録や計算結果が一致するかを確認します。
Q3Minibankは実在銀行を完全再現していますか?
いいえ。JPY普通預金と定期預金の満期利息などを扱う学習用モデルで、普通預金利息・貸出利息、外部決済網、AMLなどは範囲外です。
完全に暗記する必要はありません。大切な考え方を説明できそうなら押してください。
教材の参照元 — SOURCE TRAIL
根拠と関連教材
CURRENT IMPLEMENTATIONは確認したrepository内の実装です。HISTORICAL IMPLEMENTATIONは導入・修正の履歴で、後続migrationによる再定義があり得ます。RELATED LESSONは教材への案内で、実装の一次Sourceではありません。ASSUMPTIONは仮定、UNKNOWNは未確認を表します。
確認基点: d02eae8914f39cbf06bfe422dc39c71886f82b3e / 2026-09-11。稼働環境への適用確認: UNKNOWN。パス実在の自動検査と、記述した技術的事実の確認は別です。
- 現在の実装 — CURRENT IMPLEMENTATION — Primary Source
supabase/migrations/20260930110000_v15_pricing.sqlpublic.mature_time_deposit定期満期の最新定義。v15以降の契約は契約時の価格(版)の金利を使い、JST暦日数で単利・税引前・floorの利息を計算する。v15より前の契約は従来の式のまま。 - 現在の実装 — CURRENT IMPLEMENTATION
supabase/migrations/20260930110000_v15_pricing.sqlpricing.run_ordinary_interest / pricing.simple_interest普通預金の利息(管理責任者が期間ごとに実行)。日次の終値残高×その日に有効な金利を合計して1回だけ切り捨てる。 - 現在の実装 — CURRENT IMPLEMENTATION
supabase/migrations/20260930100000_v14_lending.sqllending.accrue_locked / lending.repay貸出利息(v14)。日割で計上し、返済のたびに未収利息から充当する。 - 過去の実装 — HISTORICAL IMPLEMENTATION
supabase/migrations/20260920115556_scalar_journal_posting_atomic_cache.sqlv15の直前の定期満期の定義。計算式は v15 より前の契約で現在も使われる。 - 過去の実装 — HISTORICAL IMPLEMENTATION
supabase/migrations/20260907113002_serialize_account_products.sql口座→商品の順のlockを導入した前々回の定義。 - 過去の実装 — HISTORICAL IMPLEMENTATION
supabase/migrations/20260824170001_time_deposit_maturity.sql満期利息の導入履歴。関数本体は後続migrationで再定義。 - 過去の実装 — HISTORICAL IMPLEMENTATION
supabase/migrations/20260819124148_create_customers.sql顧客モデル - 過去の実装 — HISTORICAL IMPLEMENTATION
supabase/migrations/20260819124248_create_bank_accounts.sql口座と残高cache - 過去の実装 — HISTORICAL IMPLEMENTATION
supabase/migrations/20260820160155_create_financial_operations_table.sql金融操作の業務記録