質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3728閲覧

【Django】データベース登録時にIDを振り直すか、データベースから取り出した時に処理をするか

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/01/01 10:15

Djangoで会計処理をするアプリを作成しています。

市販の会計ソフトから仕訳データを取り出したCSVを読み込んで、データベースにデータを保存しています。
仕訳データには、下記のデータが含まれます。
0. 日付
0. 借方勘定科目
0. 借方補助科目
0. 借方金額
0. 貸方勘定科目
0. 貸方補助科目
0. 貸方金額
0. 摘要

会計仕訳を処理するModelは、下記のとおりとしています。

python

1# models.py 2# 仕訳データのモデル 3class JournalDiary(models.Model): 4 date = models.DateField(blank=True, null=True) # 日付 5 dr_subject = models.ForeignKey(AccountingSubject,related_name="dr_subject", blank=True, null=True) # 借方勘定科目 6 dr_auxiliary_subject = models.IntegerField(blank=True, null=True) # 借方補助科目 7 dr_amount = models.IntegerField(blank=True, null=True) # 借方金額 8 cr_subject = models.ForeignKey(AccountingSubject, related_name="cr_subject", blank=True, null=True) # 貸方勘定科目 9 cr_auxiliary_subject = models.IntegerField(blank=True, null=True) # 貸方補助科目 10 cr_amount = models.IntegerField(blank=True, null=True) # 貸方金額 11 content = models.CharField(max_length=100, blank=True, null=True) # 備考 12

勘定科目については、別途勘定科目のモデルがあり、勘定科目毎にIDがバラバラなので、ForeignKeyで処理できています。
しかし、補助科目について、会計ソフトから出力される数字が、勘定科目毎に1から振ってあるので、被ってしまいます。
例えば、当座預金(110)の補助科目にもIDの1番があり、普通預金(111)の補助科目にもIDの1番があります。

個人的には、下記の2つの方法が思いつきました。
①CSVで出力された数字をそのままデータベースに保存し、補助科目はForeignKeyとしては扱わず、IntegerFieldとして扱う。表示をしたり、集計したりするときに初めて、勘定科目との関係でその勘定科目の中の補助科目として処理する。
②CSVから出力された数字を、勘定科目との関係で別のIDを振り直したうえで、データベースに保存する。補助科目はForeignKeyとして処理する。例えば、当座預金(110)の中の補助科目ID1には、11001、普通預金(111)の中の補助科目ID1には、11101というIDを振り直すという感じです。

ここまで書いてみて、②の方が良いのではないかという気がしてきたのですが、どちらの方法で処理するのが一般的でしょうか?
分かりづらい質問で申し訳ございませんが、お分かりの方ご教示頂ければ幸いです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

検索・表示の機能を実装するところまで想像できているのなら、
作りやすい・メンテしやすいと思う方でいいと思います。
どちらかといえば個人的には2の方がおすすめですが、
自分なら

当座預金(110)の中の補助科目ID1には、11001

はフィールドをまとめずに二つのフィールドのまま持たせて置きます。
ペアでユニーク制約つけることもできますし。

djangoを使うと複合キーが使えなかったりとDBのセオリーから外れることもあるので、
悩む時はとりあえず連番のprimary keyにしておいて
他のユニークなfield(s)を使って外部キーのModelを読む方がなんだかんだで無難だったりします。

投稿2018/01/04 15:41

kokardy

総合スコア781

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/05 04:49

ご回答頂き、ありがとうございます。 ForeignKeyを使うのではなく、勘定科目と補助科目のModelはそれぞれ独立して存在させたうえで、勘定科目と補助科目を紐づけるためのModelを別途作るということでしょうか? 例えば、下記のように、補助科目と勘定科目とを紐づける新たなModelを作るという考え方でしょうか? class SubjectAuxliary(models.Model): auxliary = Models.ForeignKey(AuxliarySubject) #補助科目を紐づける subject = Models.ForeignKey(Subject) #勘定科目を紐づける
kokardy

2018/01/08 16:23

そこまでやるかどうかは、データの中身の想定次第ですが、 規模が大きい場合は、なんだかんだでそうした方が楽そうというイメージです
退会済みユーザー

退会済みユーザー

2018/01/10 09:12

kokardyさん、ありがとうございます。 そのような形でやってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問