我需要在我的案例中使用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条记录, 的查询可能会受到影响。
我已经实现了这个表,它工作正常,渲染交叉表非常快,我很满意。
我只是想知道是否有更好的方法来实现它。
答案 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_from
,currency_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)