我正在开发必须处理多种货币(美元,欧元,日元)的信息系统。假设用户可以向系统添加产品。
用户于2017年2月13日添加价格为2000,货币JPY的产品#1。
用户于2017年2月14日添加价格为25,货币为USD的产品#2。

稍后(2017年2月15日),用户可以查看和过滤其产品,假设用户希望以美元查看产品,并且有一个价格范围过滤器。

目标:


用户设置了一些价格范围,我必须在数据库中正确找到这些产品


我当前的方法是:


我已经决定,欧元是我的统一货币
当用户添加产品时-使用当日汇率将每个产品价格转换为EUR
在数据库中,存储原始价格和货币(来自用户输入),存储转换后的价格(EUR)
筛选器中的价格范围是根据今天的汇率进行初始化的,因此将2000 JPY转换为USD作为下限(17.5 USD),将20 USD作为上限


问题:


用户设置限制从17.5 USD开始20 USD
我将17.5美元转换为EUR_value_1,将20美元转换为EUR_value_2
选择价格在EUR_value_1和EUR_value_2之间统一的数据库
值与数据库中的产品不匹配,因为使用率可以更高/更低(每天),因此值是不同的


我的问题是:


在数据库中存储这些产品,价格,货币的正确方法是什么?我应该存储所有货币值吗?
如何处理某些货币的价格范围过滤器的前端行为,但仍然能够在数据库中正确找到产品?
我应该创建一个cron来按今天的汇率重新转换所有价格吗?

最佳答案

货币汇率表在国际金融应用中很常见。通常,所有内容都以相对于一种货币(例如美元)的比率表示。每天每种货币只需要输入一个,通常是前一天的收盘价-基本货币始终为1。

Effective  Code Factor
2015-05-02 GBP  0.662251656 --based on today's rate of 1.51 GBP->USD


从USD转换为GBP:USD *因素= GBP
从GBP到USD:GBP / factor = USD

有一张幻灯片演示文稿显示了这样的表设计here。货币讨论开始于幻灯片/第12页,第16页的查询。表设计很简单:

create table XRates(
    Code       char( 3 ) not null,
    Effective  date not null,
    Factor     decimal( 12, 9 ) not null
    constraint PK_XRates primary key( Code, Effective )
);


该设计的几个不错的功能是,您可以将历史汇率保持在与当前汇率相同的表格中,而无需每天进行更新。仅在速率发生变化时-或速率发生足够变化以触发更新时才进行输入。该查询将返回在给定日期生效的汇率,即使该汇率是由已有几周历史的条目确定的(在当今的货币市场中不太可能)。

当然,您可以将基础货币设置为欧元,但是表格设计和查询不会改变。

因此,您只需要存储产品的价格和货币。价格为2000日元的产品的欧元价格可以很容易地根据生效的转换率(例如下订单的日期)进行转换。

关于database-design - 多币种信息系统,SQL不准确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42206626/

10-09 09:16