1

トランザクションのリストを保持するデータベースを設計しています。取引には2つのタイプがあります。クレジット(残高に追加)とデビット(残高から取得)という名前を付けます。

ほとんどの場合、クレジットトランザクションには有効期限があり、その後、このクレジット残高は無効になり、失われます。

借方取引は、それらがどの貸方取引からのものであるかを保存する必要があります。

賞味期限のある寛大さの余地は常にあります。正確である必要はありません(たとえば、その日の残りの時間まで)。

私の友人と私は2つの異なる解決策を考え出しましたが、どちらを使用するかを決めることはできません。おそらく、皆さんの何人かが私たちを助けてくれるでしょう。

解決策1:

3つのテーブル:Debit、Credit、DebitFromCredit

Debit: id | time | amount | type | account_id (fk)
Credit: id | time | amount | expiry | amount_debited | accountId (fk)
DebitFromCredit: amount | debit_id (fk) | credit_id (fk)

テーブルCreditでは、debitトランザクションが発生するたびにamount_debitedを更新できます。デビットトランザクションが発生すると、DebitFromCreditは、このデビットトランザクションが取り消されたクレジットトランザクションの情報を保持します。

getBalance()有効期限、金額、amount_debitedに応じて残高を取得する関数があります。したがって、天びんの物理的な保管はありません。毎回計算されます。

期限切れのトランザクションをチェックするcronジョブを追加する機会もあり、タイプとして「期限切れ」の借方トランザクションを追加する可能性もあります。

解決策2

3つのテーブル:Transactions、CreditInfo、DebitInfo

Transactions: id | time | amount (+ or -) | account_id (fk)<br />
CreditInfo: trans_id (fk) | expiry | amount | remaining | isConsumed<br />
DebitInfo: trans_id (fk) | from_credit_id (fk) | amount<br />

テーブルアカウントは、残高を保存する「残高」列を追加します。(別の可能性は、このアカウントのトランザクションの行を合計することです)。

すべてのトランザクション(貸方または借方)はテーブルトランザクションに保存され、金額の符号はそれらを区別します。

クレジットでは、creditInfoに行が追加されます。

デビット時に、1つ以上の行がDebitInfoに追加されます(必要に応じて、複数のクレジットからのデビットを処理するため)。また、クレジット情報の行は「残り」の列を更新します。

cronジョブはCreditInfoテーブルで機能し、期限切れの行が見つかると、期限切れの金額の借方レコードが追加されます。

議論

ソリューション1は、2つのテーブルを区別し、それぞれのデータの取得は非常に簡単です。また、cronジョブは実際には必要ないため(期限切れのデータを借方として追加する場合を除く)、getBalance()正しい現在の残高を取得します。レポート用のデータを取得するには、何らかの結合が必要です。冗長データはありません。

ソリューション2は、両方のトランザクションを1つのテーブルに保持し、金額は+と-であり、このテーブルは更新されていません。挿入のみ。クレジット情報は、有効期限(cronジョブ)または借方記入時に更新されます。レポート用のデータを取得するための単一テーブルクエリ。ある程度の冗長性。

選択?

どの解決策が良いと思いますか?残高は物理的に保存する必要がありますか、それとも計算する必要がありますか(cronジョブで更新される可能性があることを考慮して)?どちらが速いでしょうか?

また、あなたたちがより良い提案を持っているなら、私たちはそれも聞いてみたいです。

4

2 に答える 2

1

どの解決策が良いと思いますか?

解決策2.挿入するだけのトランザクションテーブルは、会計監査にとってより簡単です。

残高は物理的に保存する必要がありますか、それとも計算する必要がありますか(cronジョブで更新される可能性があることを考慮して)?

天びんは物理的に保管する必要があります。必要になるたびにすべてのトランザクション行を読み取って残高を計算するよりもはるかに高速です。

于 2012-09-18T14:30:36.040 に答える
0

私はデータベースと呼ばれるコースに合格したIT学生です、私の経験不足を許してください。

私はMySQLワークベンチを使用してこれを作成しました。モデルを電子メールで送信でき、画像からモデルを再作成する時間を無駄にすることはありません。

このスキーマは10分で作成されました。普通店の保有取引。

ここに画像の説明を入力してください スキーマの説明複数の電話とアドレスを持つことができる人がいます。人は取引をしているときに取引をします、

  • カード名を入力します(例:American Express、カードタイプのクレジットまたはデビット(MySQLワークベンチにはドメインまたはパワーデザイナーとしての制約がないため、フィールドタイプをvarcharのままにしました)は、文字列のデビットまたはクレジットの入力を制限する必要があります。
  • カードの有効期限(例:8/12)
  • カード番号(例:1111111111)
  • 減少する量(例:20.0)
  • データ入力時にトランザクションプログラムのタイムスタンプが入力されます
  • そして、person_idpersonフィールドを介してトランザクションを行った人にリンクします。例1

テーブルパーソンのID1の名前はJohnSmithです。

これが提供するもの:

  1. 取引はカードを独自に使用しています。クレジットまたはデビットは両方ともなしにすることはできません。
  2. 速度の少ないテーブルは、システムの速度を上げます。

プログラムに必要なもの:

  1. フィールド変数exactTimestampの継続的な比較は、トランザクションを入力するときの変数cardExpieryよりも小さくなります。
  2. カードの詳細を常に入力します。

Whatsシステムにはありません

  1. 特別なフィールドで使用される節約量。ただし、SQLクエリで実行できます。
  2. 残っている金額を節約して、個人情報を見つけました。つまり、あなたは店に来て、店主はあなたがまだいくらのお金を持っているか私に尋ねます。
  3. システムは、人をカードに明示的に結び付けません。その人が立ち会い、カードの詳細が記載されたカードを使用し、その人の匿名性を維持する必要があります。(これは、店主などのアマチュアが手で入力しないように十分に複雑なクエリである必要があります)、前回どのカードを使用したかを知りたい場合は、最後のトランザクションを取得してカードフィールドを抽出します。

これを提案として考えていただければ幸いです。

于 2012-09-18T16:34:46.993 に答える