非効率的なコードを作成していると心配しているので、コーディングに関するアドバイスが必要です。Django webapp - 金融アカウント情報の追跡
私は会社の財務データを追跡するwebappを持っています。私はAccounts
と呼ばれるテーブルを持っており、収入、現金、買掛金、売掛金などの典型的な財務勘定に対応するレコードのコレクションを持っています。これらのレコードは、単純に外部キーとして指される名前の所有者です。
私はまたAccounts
のすべてのアカウントの内外へのすべてのお金の取引を記録するAccount_Transaction
というテーブルを持っています。基本的に、Account_Transaction
テーブルは、さまざまなアカウントが変更されていることを指摘しながら、すべての重労働をします。
たとえば、販売が行われると、Account_Transaction
テーブルに2つのレコードが作成されます。現金残高を増やすための1件の記録と収入バランスを高める2番目の記録。
Trans Record 1:
Acct: Cash
Amt: 50.00
Date: Nov 1, 2011
Trans Record 2:
Acct: Revenue
Amt: 50.00
Date: Nov 1, 2011
私は2つのレコードを持っていますが、それぞれが別のアカウントを指しています。今私が現金残高を見たいのであれば、それぞれAccount_Transaction
レコードを見て、レコードが現金を扱っているかどうかをチェックしなければなりません。その場合は、そのレコードの量を加算または減算して、次のレコードに移動します。
通常の営業日には、上記のような取引が200~300件以上ある可能性があります。したがって、Account_Transaction
テーブルはかなり早く成長します。数ヶ月後、テーブルには数千のレコードがある可能性があります。これはデータベースにはあまりあまりないとはいえ、ユーザーが売掛金などの現在の残高を知りたいときはいつも、Account_Transaction
テーブル全体を走査して、アカウント名 "Accounts債権 "である。
私はこれを最も最適な方法で設計しているかわかりません。私は各口座(「現金」、「売掛金」、「収入」など)ごとに別個のテーブルを作成することを検討しましたが、そのアプローチでは全く同じパラメータで15-20のテーブルを作成していました、彼らの名前以外。これは貧弱なデザインのようだったので、私はこのAccount_Transaction
アイデアを持って行った。
これは、この種のデータを処理する適切な方法のようですか?私が本当に養子にするべきであるこれを行うための良い方法はありますか?
ありがとうございます!
したがって、クエリセットでフィルタを実行すると、その演算は重すぎる計算になりませんか?私はフィルタ演算子を使用することを計画していましたが、これはまだ、1つのアカウントのすべてのレコードを合計するというやや非効率的な方法であると仮定しました。 他の人たちがこれをどのようにしているかを検索したところ、この設計問題に最も近づく方法を説明する興味深い記事を見つけました。役に立つと思われる人のために:http://homepages.tcp.co.uk/~m-wigley/gc_wp_ded.html – Garfonzo
テーブルを正しく索引付けしても操作は重くなりません。 Djangosのモデル構文を使ってインデックスを指定することもできます。それはあなたのためにそれらを設定します。私は結果をキャッシュすることもいくつかのケースではうまくいくと思いますが、無効化については非常に厳格である必要があります。 – Bartek