6

在我的例子中,我需要使用 RDBMS存储货币汇率交叉表(例如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 条记录,查询可能会开始受到影响。

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

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

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_fromcurrency_code_to然后effective_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

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

你想有买卖数字吗?通常,您要确保在 ccy 的买卖之间有一点领先,以确保组织不会亏损。这被一些人称为明智的商业方法,而另一些人则称之为欺诈。

如果这些数字是手动输入的,请确保查看之前的货币数字,如果差异 > 3%,则警告用户。

唯一的另一个问题是当日汇率波动很大时。您想在宣战前只进行一次转换吗?

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

于 2012-11-21T00:41:39.540 回答
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 相同。Varchars 被有效地存储。

另外,不是value总是1.00吗?(也就是说,您不总是将 1 转换为另一种货币的倒数吗?)如果是这样,您可以value从表中删除该列。

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

我可以看到货币名称有另一个表:

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