SPA開発 5. データベース設計 #02
2019年10月12日に更新

会計システムのデータベース設計に挑む

今回設計する会計システムのデータベース

今回は会計ソフトの集計機能を実現するデータベース設計を行います。

この設計は独学でたどり着いたものです。

ベストな設計かは保証できません。悪しからず。。。

会計ソフトとの違い

会計ソフトは大きく2つの機能に分かれます。

  1. 入力機能 … 借方、貸方の簿記のルールに則った会計数値の入力機能。
  2. 集計機能 … 1で入力した数値を財務諸表のルールに則って集計し表示する機能。

このアプリケーションは、2の集計した後の数値をCSVデータで取り込む仕様としています。

ですので、1の借方、貸方の入力機能は必要ありません。

2の集計機能をメインに作成していきます。

2019-08-01 14-27-53

正規化する前の勘定科目一覧

先にこちらに目を通しておくと、この記事が理解しやすいと思います。

データベースを正規化する前に、会計システムの勘定科目データを整理する

DBの全体像

ER図ではありませんが、今回設計するデータベースの全体像をまとめました。

DB設計

この記事では、財務諸表を表示するテーブル群について1つ1つ説明していきます。

Usersテーブル

ログインユーザーを管理するテーブルです。

カラム名 デフォルト 長さ NULL 内容
email string 255 false
password_digest string 72 false
activated boolean false false 認証プラグ
admin boolean false false 管理者プラグ
company_id FK 選択中の会社ID
company_count integer 0 false 会社の保有数

関連付け

ユーザーと会社は1対1の関係となります。

company_count

将来アプリを有料化することを見込んで、無料ユーザーが作れる会社数を制限するために会社保有数をカウントしています。

Railsのキャッシュカウンターの仕組みを使っています。

BizTypesテーブル

会社のタイプを保存するテーブルです。

カラム名 デフォルト 長さ NULL 内容
name integer 0 false 0:法人, 1:個人

関連付け

ありません。

name

法人、個人いずれかの値が入ります。

ここの名前はシステム側で管理したいのでinteger型にしています。

そして、モデル側でenum name: { "法人":0, "個人":1 }と設定することにより、0か1以外の値を保存しようとするとエラーが発生します。

Companiesテーブル

会社を保存するテーブルです。

カラム名 デフォルト 長さ NULL 内容
owner_id FK false user_id
biz_type_id FK false
name string 255 false 会社名
units integer 0 false 0:円, 1:千円, 2:百万円, 3:円(百切捨), 4:千円(万切捨)

関連付け

userは複数の会社をもつことができます。1対nの関係です。

biz_typeは1対nの関係です。

owner_id

どのuserが会社のオーナーなのか分かりやすくするために、カラム名をuser_idから変更しています。

units

会計数字を表示するときの会社の標準単位を保存します。

AccountingSheetsテーブル

会計帳簿のタイプを保存するテーブルです。

カラム名 デフォルト 長さ NULL 内容
name integer 0 false 0:貸借対照表, 1:損益計算書

関連付け

ありません。

AccountingGroupsテーブル

財務諸表に表示する集計科目を保存するテーブルです。

カラム名 デフォルト 長さ NULL 内容
biz_type_id FK false
sheet_id FK false accounting_sheet_id
name string 255 false 資産, 負債, 純資産…
sort_order integer false 並び順
add_ids string “0” 255 false 加算するaccounting_groupのID群
sub_ids string “0” 255 false 減算するaccounting_groupのID群

関連付け

biz_typeと1対nの関係です。

accounting_sheetと1対nの関係です。

biz_type_id

法人、個人によって表示する集計科目が違います。

そこで、会社のbiz_typeと一致する集計科目を取得するために関連付けています。

name

ここには、必ず表示する財務諸表の名前が入ります。

例えば「負債・純資産」や「売上総利益」などの勘定科目と直接紐付きがない名前も保存します。

add_ids, sub_ids

ここにはaccounting_groupのIDがstring型で入ります。こんな感じ -> “2,3”

SQLightには配列型を保存できないので、データを取得する際に配列に変換します。

このカラムのIDから加算、もしくは減算する数値を取得します。

この先生からヒントを得ました。

複雑な計算式をDB化するテクニック

AccountingSubGroupsテーブル

資産や負債に紐づく「流動資産」「固定資産」などのサブグループを保存するテーブルです。

カラム名 デフォルト 長さ NULL 内容
biz_type_id FK false
sheet_id FK false accounting_sheet_id
group_of FK false accounting_group_id
name string 255 false 流動資産, 固定資産, 繰延資産…
sort_order integer false 並び順

関連付け

biz_typeと1対nの関係です。

accounting_sheetと1対nの関係です。

accounting_groupと1対nの関係です。

group_of

accounting_group_idは名前が長いので変更しています。

AccountingCategoriesテーブル

流動資産や固定資産に紐づく「現金及び預金」や「売上債権」などを保存するテーブルです。

カラム名 デフォルト 長さ NULL 内容
biz_type_id FK false
sheet_id FK false accounting_sheet_id
sub_group_id FK false accounting_sub_group_id
name string 255 false 現金及び預金, 売上債権…
sort_order integer false 並び順

関連付け

biz_typeと1対nの関係です。

accounting_sheetと1対nの関係です。

accounting_sub_groupと1対nの関係です。

AccountingItemsテーブル

勘定科目を保存するテーブルです。このテーブルはユーザーが自由に保存することができます。

カラム名 デフォルト 長さ NULL 内容
company_id FK false
category_id FK false accounting_category_id
name string 30 false 勘定科目名
required boolean false false 必須科目プラグ
subtraction boolean false false 集計時に減算する科目のプラグ
sort_order integer false 並び順

関連付け

companyと1対nの関係です。

accounting_categoryと1対nの関係です。

required

勘定科目には、必ず存在すなければならない科目があります。

法人の場合「繰越利益剰余」、個人の場合「元入金」です。

この科目はユーザーが自由に編集できないようにプラグを設定しました。

subtraction

同じ勘定科目でも、集計するときに減算する科目があります。

売上高合計を算出する場合の「売上値引」や、売上原価を算出する場合の「期末商品棚卸高」です。

集計値に加算、減算を切り替えるためプラグを設定しました。

Fiscaltermsテーブル

会計年度を保存するテーブルになります。

カラム名 デフォルト 長さ NULL 内容
company_id FK false
title string 10 false 会計年度のタイトル
start_date date false 期首月
end_date date false 期末月

関連付け

companyと1対nの関係です。

start_date, end_date

今回のアプリでは、月単位でしか数値を入力しないため、ユーザーは年度と月を選択して保存します。

start_dateとend_dateは「YYYY-MM-01」の様に、日付は必ず1日にして保存する仕様としました。

AccountingValuesテーブル

会計数値を保存するテーブルです。

カラム名 デフォルト 長さ NULL 内容
company_id FK false
term_id FK false fiscalterm_id
item_id FK false accounting_item_id
month string 10 false 会計月
amount bigint false 会計数値

関連付け

companyと1対nの関係です。

fiscaltermと1対nの関係です。

accounting_itemと1対nの関係です。

ユニーク制約

1つの会計年度の1つの会計月に、1つの会計数値しか保存できません。

この様なユニーク制約を付けています。

add_index :accounting_values, [:term_id, :item_id, :month], unique: true

month

多くの会計ソフトは決算月という概念があり、会計期間を最大13ヶ月と設定しています。

date型にするとの決算月「YYYY-13-01」が保存できないため、monthカラムはstring型としています。

以上が財務諸表を表示するテーブル群

以上のテーブルを組み合わせて、貸借対照表、損益計算書を表示させていきます。

その他のテーブルについては、「本当に財務諸表を表示できるか?」を確認してからでも遅くはありませんので、今回の記事では端折ります。

次回からは、本格的なモデル開発を行っていきましょう。

参考にした本

非常に勉強になりました。

会計システムのデータベース設計は載っていませんでしたが、基礎がしっかりと書かれており、データベース設計ど素人の自分にも飲み込みやすい内容でした。

この本は会計知識の内容が9.5割です。

データベース設計を目的に購入すると後悔する内容です。

しかし、会計知識を目的に購入するには十分な内容です。

自分は前者でしたので5~6ページ程参考にしましたが後は読んでいません。

参考にした記事

現在、カテゴリー「Rails apiとNuxt.jsでSPA開発」のデモアプリを構築中です。記事になるまでもう少々のお時間が必要です。ブログの更新が止まって申し訳ありません。デモアプリの進捗状況は こちらの記事 で随時お伝えしてまいります。
スポンサー広告
次の記事はこちらです
SPA開発
今日のTweet
スポンサー広告