3

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

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

目标:

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

我目前的做法是:

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

问题:

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

我的问题是:

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

2 回答 2

3

货币汇率表在国际金融应用程序中很常见。通常,一切都被称为与一种货币(例如美元)的比率。每天每种货币只需要输入一次,通常是前一天的收盘价——除了基础货币,它总是 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 日元的产品的欧元价格可以很容易地根据有效的转换率进行转换,比如下订单的那一天。

于 2017-02-15T08:31:37.163 回答
2

以原始货币存储原始价格。您的最后一个问题是业务决策,而不是技术决策,因此不要期望在这里得到答案。

选项1

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

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

如果您需要,我可以发布一个示例 - 如果需要,请提出答案或写评论。

选项 2

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

于 2017-02-14T11:58:21.143 回答