2016-08-19 9 views
2

私はお金の有効期限の追跡に関する問題を現時点で扱っています(元々はお金ではありませんが、より便利な例として使用しています)。お金の有効期限追跡

ユーザーは、神秘的な理由でプラットフォームからお金を稼ぐことができ、商品(商品、ギフトなど)を購入するために費やすことができます。

私はユーザーバランスの現在のバランスを見つけるためのアルゴリズム(SQLクエリの最良のケース)を探しています。支出とお金を稼ぐの

イベントが異なるデータベース(MySQLの)テーブルに保存されている(のはuser_earneduser_spentをしましょう)。だから通常のケースでは、私は単にユーザーの合計をuser_earnedから数え、使用された金額(合計でuser_spent)を引いただけです。

BUT! 獲得したユーザーのお金が2年間で失効するという条件があります。使用されていない場合はです。 つまり、ユーザーがお金を使っていない、またはその一部を使用していない場合は、有効期限が切れます。ユーザーがお金を使用する場合は、のうち最も古いものであるから使用されるため、残高(ボーナス)はユーザーの好みで計算できます。どちらのテーブル(user_earneduser_spentが)タイムスタンプの日付の追跡のためのを持って

Money expiration logic

これらは、場合により良い理解を持っている時間のイベントと5つのシナリオです。

+0

これは、アプリケーションコードで最もよく行われる作業です。 –

+0

現在、イベントのリスト(受信、使用、有効期限)を作成し、それを1つずつ実行するだけで、残高を計算するサービスを実装しました。それは動作しますが、SQLクエリでバランスを取ってユーザーに正のバランスを持たせる必要がある場合は、前にこの値をデータベースに非正規化する必要があります。 – Aistis

答えて

1

私は私のプロジェクトで同様のことをしました。

は、あなたが「使用のお金をマークするspends_coveringに1つのまたは多くの行を挿入する必要があり、各spendsレコードに対してそう

を使用すると、列 spend_idと追加のテーブルspends_coveringを必要とするように、見えるearhed_idsum

残高は、日付が2年未満の場合は使用されません。 1つ(またはそれ以上)のすべての履歴の詳細、各「ユーザ」のためだけに現在の残高を有するものと -

select sum(sub.earned_sum-sub.spent_sum) as balance 
from 
    (select e.sum as earned_sum, sum(sc.sum) as spent_sum 
    from earned e 
     left join spends_covering sc on e.earhed_id=sc.earhed_id 
    where e.date BETWEEN ... 
    group by e.earhed_id 
    having earned_sum > spent_sum) sub 
0

2つのテーブルを持っている価値があるかもしれません。トランザクションを使用して、2つのトランザクションを同期させてください。