4

金融取引の状態を保存するためのテーブルが必要です。このトランザクションの状態は、このクラスで大まかにモデル化できます。

class FinancialTransaction
{
    Integer txId,
    Money oldLimit,
    Money newLimit,
    Money oldBalance,
    Money newBalance,
    Date txDate
}
class Money
{   
    Currency curr,
    BigDecimal amount
}

スキーマの最初の設計は次のようになります。

CREATE TABLE tx
(
    txId bigint(20) unsigned NOT NULL,
    oldlimit_currency varchar(3) NULL,
    oldlimit_amount decimal(7,5) default 0.00,
    newlimit_currency varchar(3) NULL,
    newlimit_amount decimal(7,5) default 0.00,
    ----snipped----
    PRIMARY KEY (txId)
)

2つのことが私を心配しています:

  1. 各トランザクションは、1つの通貨に基づいて発生します。複数の通貨で発生する可能性のある取引をサポートする必要があるかどうかについては、十分に考えていません。それが変わらないと仮定すると、それなら、1つの通貨列を維持するだけの方がスペース効率が良いのではないでしょうか。この単純な解決策を後悔しますか?
  2. 各Moneyアイテムは値オブジェクトなので、代わりにすべてのMoneyオブジェクトを個別のMoneyテーブルに保存し、元のテーブルでMoneyテーブルの外部キーとしてmoneyIdsを使用する必要がありますか?

あれは、

CREATE TABLE tx
(
    txId bigint(20) unsigned NOT NULL,
    oldlimit_money_id int NOT NULL,
    newlimit_money_id int NOT NULL,
    ----snipped----
    PRIMARY KEY (txId),
    FOREIGN KEY (oldlimit_money_id) REFERENCES MONEY(id) ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY (newlimit_money_id) REFERENCES MONEY(id) ON DELETE NO ACTION ON UPDATE NO ACTION
)

代替デザインはありますか?

lazywebに感謝します。

4

4 に答える 4

4

通貨と貨幣価値は 2 つの異なる概念であるため、それらを分離することをお勧めします。「値」用に別のテーブルを作成する必要はありませんが、これらは別のエンティティであるため、通貨用にテーブルを作成することをお勧めします。新しいデザインは次のようになります。

CREATE TABLE tx
(
    id bigint(20) unsigned primary key,
    old_limit_currency_id int not null references CURRENCY(id),
    old_limit_value decimal(7,5) not null,
    new_limit_currency_id int not null references CURRENCY(id),
    new_limit_value decimal(7,5) not null
)

また、decimal(7,5) にシナリオに十分なスペースがあるかどうかを確認してください。少し低く見えます。古いことわざがあります:「後悔するよりも安全に」:)

于 2009-01-09T08:18:00.293 に答える
2
  1. 将来、2つの通貨間のトランザクションをサポートする必要がある場合は、これを各通貨の1つを使用する2つのトランザクションとしてモデル化できるはずです。
  2. Moneyオブジェクトは、意味的にはエンティティではなく値のように見えます。したがって、それらをエンティティとして分離する必要はないと思います。
于 2009-01-09T08:08:26.897 に答える
2

3 番目のアイデアはどうでしょうか。

CREATE TABLE tx
(
  txId bigint(20) unsigned NOT NULL,
  currency varchar(3) NOT NULL,
  oldlimit decimal(7,5) default 0.00,
  newlimit decimal(7,5) default 0.00,
  ----snipped----
  PRIMARY KEY (txId)
)

1 つのトランザクションのすべての金額は同じ通貨である必要がありますよね?

于 2009-01-09T09:08:45.447 に答える
-3

やり過ぎでない場合は、さらに一歩進んで、すべての金額/値を単一の通貨で保存し、為替レート表を維持します。

于 2009-01-09T08:34:04.723 に答える