今回設計する会計システムのデータベース
今回は会計ソフトの集計機能を実現するデータベース設計を行います。
この設計は独学でたどり着いたものです。
ベストな設計かは保証できません。悪しからず。。。
会計ソフトとの違い
会計ソフトは大きく2つの機能に分かれます。
- 入力機能 … 借方、貸方の簿記のルールに則った会計数値の入力機能。
- 集計機能 … 1で入力した数値を財務諸表のルールに則って集計し表示する機能。
このアプリケーションは、2の集計した後の数値をCSVデータで取り込む仕様としています。
ですので、1の借方、貸方の入力機能は必要ありません。
2の集計機能をメインに作成していきます。
正規化する前の勘定科目一覧
先にこちらに目を通しておくと、この記事が理解しやすいと思います。
DBの全体像
ER図ではありませんが、今回設計するデータベースの全体像をまとめました。
この記事では、財務諸表を表示するテーブル群について1つ1つ説明していきます。
Usersテーブル
ログインユーザーを管理するテーブルです。
カラム名 | 型 | デフォルト | 長さ | NULL | 内容 |
---|---|---|---|---|---|
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から加算、もしくは減算する数値を取得します。
この先生からヒントを得ました。
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ページ程参考にしましたが後は読んでいません。