2012-11-21 101 views
6

我需要在我的情況下使用RDBMS,MySql存儲貨幣匯率交叉表(例如http://www.exchangerates.org.uk/currency/currency-exchange-rates-table.html)的值。設計並存儲貨幣匯率交叉表

用戶將每天更新數字,系統將存儲不同的版本。

我想知道你將如何設計表格,或者如果你想要模型。

最簡單的方法,當然,通過使用一個表從,到和值列

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

,但我很想知道是否有其他(更好的)解決方案。

非常感謝。

編輯

我道歉,如果它是不明確的,但我在表演和可擴展性特別感興趣。

保留價值/反向值結構並給定90種貨幣,貨幣兌換交叉表每天需要4,050條記​​錄。

如果每天創建一個新版本,一年內會有1,478,250條記錄,並且查詢可能開始受到影響。

我已經實現了表,它工作得很好,呈現十字表非常快,我很滿意。

我只是想知道是否有更好的方法來實現這一點。

+2

好了,我會小心一點關於從和領域。如果要在任何顯示中使用另一個ID(如果顯示更改,則不希望弄亂索引),則可能需要將另一個ID連接到char(3)。除此之外...什麼是價值和inverse_value的?我個人只是使​​用從,評分和評分。 – RonaldBarzell

+0

是的,架構只是一個簡化的版本,在我的情況下,我確實有一個額外的表用於整數ID的貨幣。而且,因爲數字可能不同,所以需要inverse_value。 –

+0

是否有機會將答案授予其中一個答案? – Ewen

回答

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。

2

Marco, 您可能需要一個日期字段或布爾isCurrent,因此您可以選擇最新的ccy轉換。

你想要購買和銷售數字嗎?通常情況下,你要確保在購買和銷售ccy之間有一定的領導方式,以確保組織不會丟失。這被一些人稱爲明智的商業方法,並被其他人譏諷。

如果手動輸入這些數字,一定要看看上圖的貨幣,如果有> 3%的誤差,然後向用戶發出警告。

唯一的另一個問題是,當匯率在當天大幅波動。在戰爭宣言之前你想堅持一個轉換嗎?

看起來你在正確的軌道上。

+0

是的,這些是買/賣數字。我說過,客戶端會手動輸入值來簡化事情。實際上,他會上傳一個由內部工具自動生成的excel。 –

2

我不會親自使用「自然」鍵。取而代之的是,有國家/有貨幣實體的表:

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

然後使用標識爲那些在交叉表:

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) 

這讓我改變了這個國家的名字命名的符號,全名,無需更改交叉表的定義。查詢轉換值時加入兩個表。

而且,我與十進制(10,4)去了,我建議你找了最大可能。編程更新頭痛是不值得限制尺寸的,並且稍後會發現您選擇的尺寸太小。它沒有佔用足夠的空間來處理這些錯誤。用於名稱的varchar相同。 Varchars被有效地存儲。

而且,是不是value總是將是1.00? (也就是說,你是不是總是將1轉換爲另一種貨幣的逆轉?)如果是這樣,你可以從表中刪除value列。

我個人比較喜歡的所有表具有生成的ID值,所以我把一個交叉表,但有些人可能會認爲這是不必要的。之後我經常會發現,當我選擇放棄時,我希望我已經添加了它。

我可以看到其對貨幣的名稱的另一個表:

currency 
-------- 
currency_id : integer not null auto_increment 
country_id : integer 
name : varchar(255) 
symbol : varchar(255) 
+0

我同意,我不喜歡自然鍵,我的只是一個簡化版本。我其實對錶演和可擴展性很感興趣,我會更新這個帖子,試圖更清晰。此外,值始終爲!= 1,而理論上的反向值應爲1 /值,可能因買/賣性質而有所不同。最後,感謝小數點的提示,這絕對是一個好點! –

+0

回覆:性能等我有一次類似的交叉表(遊戲對手之間殺死數量),這正是我想出的。效果很好。 – Marvo