6

私の場合、RDBMS、MySql を使用して、為替レートのクロス テーブル (例: http://www.exchangerates.org.uk/currency/currency-exchange-rates-table.html ) の値を保存する必要があります。

ユーザーは数字を毎日更新し、システムはさまざまなバージョンを保存します。

テーブルをどのように設計するのか、それともモデルが必要なのか疑問に思っていました.

もちろん、最も簡単な方法は、from、to、およびvalues列を持つテーブルを使用することです

from: char(3)
to: char(3)
value: decimal(6,4)
inverse_value: decimal(6,4)

しかし、他の(より良い)解決策があるかどうか知りたいです。

どうもありがとう。

編集

明確でない場合は申し訳ありませんが、パフォーマンスとスケーラビリティに特に関心があります。

value/inverse_value 構造を維持し、90 の通貨を指定すると、通貨為替クロス テーブルには 1 日あたり 4,050 レコードが必要になります。

新しいバージョンが毎日作成されると、1 年で 1,478,250 レコードになり、クエリが影響を受け始める可能性があります。

テーブルを実装しましたが、問題なく動作しています。クロス テーブルのレンダリングは非常に高速で、満足しています。

これを実装するためのより良い方法があるかどうか疑問に思っていました。

4

3 に答える 3

3

これは良いスタートのように見えます。(これらの値を毎日更新するだけの場合は、日時フィールドではなく) 日付フィールドも追加します。だから多分このようなもの:

currency_code_from: char(3)
currency_code_to: char(3)
conversion_value: decimal(6,4)
inverse_conversion_value: decimal(6,4)
effective_date: date()

これによりインデックス要件が決まるため、テーブルのクエリを計画しているさまざまな方法が何であるかはわかりませんが、おそらく、、、およびフィールド全体currency_code_fromで複合主キーを使用し、必要に応じて特定のインデックスを追加しますクエリ。currency_code_toeffective_date

次に、表示に必要な場合は、通貨の名前と通貨記号を格納する関連する追加のテーブルが必要になる場合があります (使用する場合は、国旗の画像へのリンクも可能です)。

currency_code: char(3)
currency_name: varchar(50)
currency_symbol: char(3)
currency_image: varchar(100)

このテーブルの主キーは currency_code です。

于 2012-11-21T00:36:46.970 に答える
2

私は個人的に「自然な」キーを使用しません。代わりに、国/通貨を持つエンティティのテーブルを用意します。

country
-------
country_id : integer not null auto_increment
name : varchar(255)
abbrev : varchar(255)
motto : varchar(255)
. . .

次に、クロス集計内の ID を使用します。

currency_exchange
-----------------
currency_exchange_id : integer not null auto_increment
from_country_id : integer
to_country_id : integer 
value : decimal(10,4)
inverse_value : decimal(10,4)

これにより、クロス集計表の定義を変更することなく、国名を記号やフルネームなどに変更できます。コンバージョン値を照会するときに、2 つのテーブルを結合します。

また、私は decimal(10,4) を使用しましたが、可能な最大値を調べることをお勧めします。サイズを制限して、小さすぎるサイズを選択したことに後から気付くことは、プログラミングの更新に頭を悩ませる価値はありません。これらのバグに対処する価値があるほど十分なスペースを占有しません。名前に使用する varchar についても同じです。Varchar は効率的に格納されます。

また、 はvalue常に 1.00 になるのではないですか? (つまり、常に 1 を別の通貨の逆数に変換しませんか?) もしそうならvalue、テーブルから列を削除できます。

個人的には、すべてのテーブルで ID 値を生成するのが好きなので、1 つをクロス集計に入れましたが、不要だと言う人もいるかもしれません。後で、それを除外することを選択したときに、追加したかったことに気付くことがよくあります。

通貨の名前の別のテーブルがあることがわかりました。

currency
--------
currency_id : integer not null auto_increment
country_id : integer
name : varchar(255)
symbol : varchar(255)
于 2012-11-21T01:03:53.947 に答える
2

マルコ、最新のccy変換を選択できるように、おそらく日付フィールドまたはブール値のisCurrentが必要になるでしょう。

フィギュアを売買したいですか?通常、組織が負けないように、ccy の購入と販売の間に若干のリード ウェイがあることを確認します。これは、賢明なビジネス アプローチと呼ばれることもあれば、揶揄することもあります。

これらの数値を手動で入力する場合は、通貨の前の数値を確認し、3% を超える不一致がある場合は、ユーザーに警告してください。

他の唯一の問題は、為替レートが 1 日に大きく変動する場合です。宣戦布告前に一度だけ改宗したいですか?

あなたは正しい軌道に乗っているようです。

于 2012-11-21T00:41:39.540 に答える