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



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

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

目标:

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

我目前的方法是:

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

问题:

  • 用户设置限额从17.5美元到20美元
  • 我将17.5美元兑换成欧元值1,将20美元兑换成欧洲值2
  • 选择到price_unified介于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

从美元到英镑:美元*因素=英镑
从英镑到美元:英镑/因素=美元

这里有一张幻灯片展示了这样一个表格设计。货币讨论从第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

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

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

如果你需要的话,我可以发布一个例子——如果是这样的话,可以写一条评论

选项2

如果您不需要灵活性或很少更改汇率,请再次以原始货币存储价格,但也计算并以统一货币存储价格。如果您不太关心规范化,您可以在单独的表或新列中执行此操作。再次,通过修改边界并与预先计算的统一价格进行比较来进行搜索,以使用索引

最新更新