设计和存储货币汇率交叉表

时间:2012-11-21 00:27:01

标签: mysql sql database rdbms currency

我需要在我的案例中使用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种货币,货币兑换交叉表每天需要4,050条记​​录。

如果每天都会创建一个新版本,那么在一年内会有1,478,250条记录, 的查询可能会受到影响。

我已经实现了这个表,它工作正常,渲染交叉表非常快,我很满意。

我只是想知道是否有更好的方法来实现它。

3 个答案:

答案 0 :(得分: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_fromcurrency_code_to使用复合主键和effective_date字段,然后根据您的特定查询添加任何索引。

然后,您可能希望有一个额外的表来存储货币名称和货币符号(如果需要显示)(如果您想使用它也可以链接到国家/地区标志图像)

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

此表上的主键是currency_code。

答案 1 :(得分:2)

马可,   您可能还需要一个日期字段或一个布尔值isCurrent,以便您可以选择最新的ccy转换。

您想要买卖数字吗?通常,您确保在购买和出售ccy之间存在一些牵头方式,以确保组织不会丢失。这被一些人称为明智的商业方法,并被其他人欺骗。

如果手动输入这些数字,请务必查看上图中的货币以及是否存在>的差异。 3%然后警告用户。

唯一的另一个问题是当天汇率波动很大。你想在战争宣言前坚持一次转换吗?

看来你走在正确的轨道上。

答案 2 :(得分: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)

这使我可以将国家/地区的名称更改为符号,全名,等等,而无需更改交叉表的定义。查询转换值时加入两个表。

另外,我使用小数(10,4)并且我建议查找最大值。编程更新令人头疼的是限制大小,后来发现你选择了一个太小的大小。它没有占用足够的空间来使处理这些错误值得。对于名称使用的varchar也是如此。变量存储有效。

另外,value总是不是1.00吗? (也就是说,您是否总是在另一种货币中从1转换为某些反转?)如果是这样,您可以从表中删除value列。

我个人喜欢在所有表格上生成ID值,所以我在交叉表上放了一个,但有些人可能会认为这是不必要的。我经常发现,当我选择将其遗漏时,我希望我已添加它。

我可以看到另一张表格中的货币名称:

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