多货币信息系统,SQL不准确

时间:2017-02-13 14:36:50

标签: database-design currency currency-exchange-rates

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

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

目标:

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

我目前的做法是:

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

问题:

  • 用户设置限制为17.5 USD do 20 USD
  • 我将17.5美元兑换为EUR_value_1,20美元兑换为EUR_value_2
  • 选择EUR_value_1和EUR_value_2
  • 之间price_unified的数据库
  • 值与数据库中的产品不匹配,因为使用率可以更高/更低(每天),因此值不同

我的问题是:

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

2 个答案:

答案 0 :(得分:3)

货币汇率表在国际金融应用中很常见。通常,所有内容都被引用为一种货币的比率,例如美元。每天每种货币只需要一个条目,通常是前一天的收盘价 - 基本货币除外,它总是1.像这样:

Effective  Code Factor
2015-05-02 GBP  0.662251656 --based on today's rate of 1.51 GBP->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日元的产品的欧元价格可以很容易地根据有效的转换率进行转换,比如订单发出的那天。

答案 1 :(得分:2)

原始价格存储在原始币种中。你的最后一个问题是商业决策,而不是技术决定,所以不要指望在这里给出答案。

选项1

为了处理灵活方式,我建议您创建一个单独的表结构来存储汇率。创建一个函数,该函数将返回具有每种可用货币汇率的表结构。通过这种方式,您可以轻松地从使用每日费率或其他任何内容进行交换 - 您将以最低的性价格隔离该逻辑。

下一步是创建一个SP来查询结果。这里的特殊要点是你应该修改你搜索的边界而不是实际值,这样你仍然可以使用表中的索引。你将使用函数的结果来生成一个包含货币和调整该货币的边界。你将加入那张桌子。

如果你需要,我可以发一个例子 - 如果是这样的话,可以提出答案或写评论。

选项2

如果您不需要灵活性或者您很少会更改汇率 - 再次将价格保存为原始货币,同时计算并存储价格统一货币。如果您不太关心标准化,可以在单独的表或新列中执行此操作。同样,通过修改边界并与预先计算的统一价格进行比较来进行搜索,以利用索引