2017-12-23 11 views
0

私はユーザーと企業の勘定残高を追跡するための簡単なアプリを開発中です。私はこれに特定のニッチな使い方をしています(詳細を知る必要はありません)。しかし、アカウントが常に適切で最新のものになるように、さまざまな方法を検討し始めているので、いくつかの選択肢があり、ベストプラクティスが何であるか不思議です。簡単な「勘定残高」元帳を処理するためのベストプラクティス

まず、すべての取引(クレジットとデビットの両方)をトラッキングするテーブルが1つあるとします。

もっと良い選択肢は何ですか?

  1. 勘定残高を必要とするページがロードされると、テーブルが照会され、すべてのトランザクションが処理されて最新残高が計算されます。非常にリソースを消費しているようだ...
  2. すべての機能がこの「トランザクション」テーブルに追加されますが、作成/更新/削除が行われるたびに各ユーザーの実行中の残高も更新されます。必要に応じてトランザクションを表示することができますが、残高の99%が照会されます。
  3. 恐らく何も見逃されていないことを確認するために、一晩中その妥当性を確認するためにCRONジョブで#2?または、これは毎週実行することができます。

私が控えていること、または主な考慮事項が必要なことは何ですか?

ありがとうございました。 PHP/MYSQLを使用していますが、この質問/応答には関係しません。

答えて

0

デビットまたはクレジットの金額に加えて、recIDと現在の残高をインクリメントするトランザクションテーブルを保持することができます。あなたがこれを行うことがその方法:

create table myTranstable (recID IDType, customerID integer, acctBalance long, transactionAmount long) 

begin a transaction 

lock customerID 

select max(recID),balance from myTransTable where customerID=thisCustomer 

if(recID==NULL) 
    createAZeroBalanceRecordFor(thisCustomer) 
else 
if(balance + thisTransactionAmount <0) 
    doSomethingAwfulTo(thisCustomer); 
else 
    insert into myTransTable values ($newMaxId,customerID,balance+thisTransactionAmount,thisTransactionAmount) 

unlock CustomerID 

end the transaction 

あなたがテーブル全体をスキャンしたり、cronジョブを行う必要はありません。この道などの擬似コードのため申し訳ありませんが、私はPHPを知らないか、利用できる持っているもののデータベース。

+0

MySQL - トランザクションの巨大なテーブルでmax(recID)を見つけるのは効率的ですか?ユーザーテーブルから単一の一意のレコードを取り出してバランスを取るだけですか? – Shackrock