会計システムのデータベース設計に挑む
  • 2019.08.15に公開
  • 2019.10.12に更新
  • SPA開発
  • 5. データベース設計
  • No.2 / 2
「SPA開発」では、Nuxt.js v2.14未満が使用されています。 Nuxt.jsはv2.13~14で大きなバージョンアップがありました。それに伴い、書き方も大きく変化しています。 v2.14以上で書かれた「SPA開発」の続編は、カテゴリー「 Udemy 」 で公開しています。

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

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

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

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

会計ソフトとの違い

会計ソフトは大きく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ページ程参考にしましたが後は読んでいません。

参考にした記事

あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる。そんな方に向けた単発・短期間メンターサービスを行っています。
独学プログラマのサービス
SPA開発の投稿
1
  • 更新情報
  • /
  • #01
「Rails apiとNuxt.jsでSPA開発」のデモアプリを開発中...。【2020/05/19追記: このカテゴリーの更新を一旦終了といたします】
1
  • 今回作るアプリケーション
  • /
  • #01
Railsアプリの完成イメージ画像と作ろうと思った経緯
2
  • 今回作るアプリケーション
  • /
  • #02
今回作るRailsアプリの全体像と機能の整理
1
  • 開発環境を整える
  • /
  • #01
macにRailsをゼロからインストールする
2
  • 開発環境を整える
  • /
  • #02
Rails apiモードのプロジェクトを作成し、Gitにコミットする
3
  • 開発環境を整える
  • /
  • #03
Bitbucketに公開鍵を追加し、Railsプロジェクトをpushする
4
  • 開発環境を整える
  • /
  • #04
HerokuCLIのインストールとherokuアプリケーションの作成
1
  • RailsをHerokuにデプロイする
  • /
  • #01
Herokuのデータベース設定と開発に便利なgemを導入する
2
  • RailsをHerokuにデプロイする
  • /
  • #02
HerokuにPumaを導入するためのRailsセットアップ
3
  • RailsをHerokuにデプロイする
  • /
  • #03
Railsに"Hello"を表示してHerokuへデプロイする
1
  • RailsとNuxt.jsを共存させる
  • /
  • #01
【RailsとNuxt.jsの共存】Rails上にNuxt.jsのプロジェクトを構築しよう
2
  • RailsとNuxt.jsを共存させる
  • /
  • #02
Nuxt.jsからRailsへ、初めてのapi通信でHelloを表示しよう
3
  • RailsとNuxt.jsを共存させる
  • /
  • #03
Nuxt.jsにVuetify2.0を導入してFont Awesomeもインストールするぜ
4
  • RailsとNuxt.jsを共存させる
  • /
  • #04
初めてのRailsApiアプリの公開。Herokuにデプロイする準備と実際のデプロイまで
1
  • データベース設計
  • /
  • #01
データベースを正規化する前に、会計システムの勘定科目データを整理する
2
  • データベース設計
  • /
  • #02
会計システムのデータベース設計に挑む
1
  • バージョンアップ情報
  • /
  • #01
【ご報告】Nuxt.jsを2.10.2にバージョンアップしました
2
  • バージョンアップ情報
  • /
  • #02
【ご報告】Railsを6.0.0にバージョンアップしました
1
  • Userモデル開発
  • /
  • #01
本番環境と開発環境でRailsのSeedデータを切り替える
2
  • Userモデル開発
  • /
  • #02
Railsにユーザーテーブルを作成する【テーブル確認コマンド】
3
  • Userモデル開発
  • /
  • #03
【Rails】EachValidatorクラスを使ったEmailカスタムバリデーション【lib以下読み込み】
4
  • Userモデル開発
  • /
  • #04
【Rails】エラーメッセージの日本語化【i18nとja.ymlのセッティング】
5
  • Userモデル開発
  • /
  • #05
【Rails】開発・テスト・本番環境の全てにユーザーSeedデータ投入する
6
  • Userモデル開発
  • /
  • #06
【Rails】ユーザーモデルのバリデーションをテストする
1
  • ログイン周りのレイアウト設計
  • /
  • #01
【Nuxt.js】ログインフラグでレイアウトを切り替えるテクニック【2019/12/07追記あり】
2
  • ログイン周りのレイアウト設計
  • /
  • #02
【Nuxt.js】ウェルカムページのレイアウト構築【sassの導入】
3
  • ログイン周りのレイアウト設計
  • /
  • #03
【Nuxt.js】ログイン周りの入力フォームコンポーネント設計【2019/12/07追記あり】
4
  • ログイン周りのレイアウト設計
  • /
  • #04
【Nuxt.js】会員登録フォームを構築してサインアップページを完成させる
独学プログラマ
独学でも、ここまでできるってよ。
CONTACT
Nuxt.js制作のご依頼は下記メールアドレスまでお送りください。