1. ホーム
  2. sql-server

[解決済み] データベースの設計 口座残高の計算

2023-06-06 22:56:42

質問

口座残高を計算するためのデータベースはどのように設計すればよいのでしょうか。

1) 現在、私は取引テーブルから口座残高を計算しています。 取引テーブルには、説明と金額などがあります。

そして、私はすべての"amount"の値を合計し、ユーザーの口座残高を計算します。


私はこれを友人に見せましたが、それは良い解決策ではないと言われました。私のデータベースが大きくなったとき、遅くなるのでは?彼は、計算された口座残高を格納するために別のテーブルを作成するべきだと言いました。これを実行すると、2 つのテーブルを維持する必要があり、口座残高テーブルが同期されなくなる可能性があるため、リスクがあります。

何か提案はありますか?

EDIT : オプション2:私は私のトランザクションテーブル"バランス"に余分な列を追加する必要があります。 これで、私は私の計算を実行するためにデータの多くの行を通過する必要はありません。

例 ジョンは100ドルのクレジットを購入し、60ドルの負債を抱え、その後200ドルのクレジットを追加しました。

金額100ドル、残高100ドル。

金額-$60、残高$40。

金額200ドル、残高240ドル。

どのように解決するのですか?

古くからある問題ですが、一度もエレガントに解決されたことがありません。

私が働いてきたすべての銀行パッケージは、口座の実体と一緒に残高を保存します。移動の履歴からその場で計算することは、考えられません。

正しい方法は

  • 移動テーブルには、各勘定科目の「開始残高」トランザクションがあります。 トランザクションがあります。これは数年後に これは、数年後に古い移動を移動する必要があるときに を移動する必要があります。 テーブルから履歴テーブルに移動させる必要があります。 テーブルへ移動する必要があるときに必要になります。
  • 口座エンティティには、残高 フィールド
  • ムーブメントテーブルにトリガーがあり テーブルのトリガーがあります。 の残高を更新するトリガがあります。明らかに、それはコミットメント 制御を行います。もし、トリガーを持つことができないのであれば、必要なのは ユニーク モジュールが必要です。このモジュールはコミットメントコントロールのもとで動きを書き込みます。
  • オフラインで実行できる「セーフティネット」プログラムも オフラインで実行でき、すべての残高を再計算し すべての残高を再計算し、表示する(そして オプションで誤った残高を修正する を表示します。これはテストに非常に有効です。 テストに非常に便利です。

一部のシステムでは、すべての動きを正の数として保存し、from/to フィールドを反転させるか、フラグを使用してクレジット/デビットを表現します。個人的には、クレジット フィールド、デビット フィールド、および署名された金額を好むので、これによって逆転がはるかに容易になります。

これらの方法は、現金と有価証券の両方に適用されることに注意してください。

特にコーポレートアクションの場合、1 つ以上の買い手と売り手の現金残高、それらのセキュリティポジションの残高、および場合によってはブローカー/預託を更新する単一のトランザクションに対応する必要があります。