2011-09-18 15 views
0

非効率的なコードを作成していると心配しているので、コーディングに関するアドバイスが必要です。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

Accounts Receievableアカウントのステータスを把握するために、すべてのレコードを繰り返し処理する必要があるのはなぜですか? Django ORM内で.filterを使用して必要なレコードを選択するだけでは、何かが欠けていると思いますか?

レコードが大きくなるにつれ、レポートに日付フィルタリングを追加することができます。ほとんどの場合、会計士は履歴データ全体ではなく、今四半期や月などの数値のみを必要とします。

その列にインデックスを追加して選択を最適化し、Djangos aggregationをチェックアウトしてデータベースから値を集計します。

最後に、「クイックビュー」スタイルのレポートをスピードアップするために、いくつかの控えめなキャッシングを行うだけで、総数が非常に短くなるようにすることができますが、誤検知がないように注意する必要があります。レコードを変更したときのキャッシュは必須です。

+0

したがって、クエリセットでフィルタを実行すると、その演算は重すぎる計算になりませんか?私はフィルタ演算子を使用することを計画していましたが、これはまだ、1つのアカウントのすべてのレコードを合計するというやや非効率的な方法であると仮定しました。 他の人たちがこれをどのようにしているかを検索したところ、この設計問題に最も近づく方法を説明する興味深い記事を見つけました。役に立つと思われる人のために:http://homepages.tcp.co.uk/~m-wigley/gc_wp_ded.html – Garfonzo

+0

テーブルを正しく索引付けしても操作は重くなりません。 Djangosのモデル構文を使ってインデックスを指定することもできます。それはあなたのためにそれらを設定します。私は結果をキャッシュすることもいくつかのケースではうまくいくと思いますが、無効化については非常に厳格である必要があります。 – Bartek

0

Accountテーブルの利用可能な金額を正確に把握していないのはなぜですか? Account_Transactionは、取引履歴を表示するためにのみ使用できます。

関連する問題