首页 文章

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

提问于
浏览
3

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

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

目标:

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

我目前的做法是:

  • 我已经决定,欧元是我的统一货币

  • 当用户添加产品时 - 使用今天的汇率将每个产品价格转换为EUR

  • 在数据库中,存储原始价格和货币(来自用户输入),存储转换后的价格(EUR)
    过滤器中的

  • 价格区间按今日汇率初始化,因此2000日元兑换美元作为下限(17.5美元),20美元作为上限

问题:

  • 用户设置限制从17.5 USD到20 USD

  • 我将17.5美元兑换为EUR_value_1,20美元兑换为EUR_value_2

  • 选择EUR_value_1和EUR_value_2之间price_unified的数据库

  • 值与数据库中的产品不匹配,因为使用的速率可以更高/更低(每天),因此值不同

我的问题是:

  • 什么是在数据库中存储这些产品,价格,货币的正确方法?我应该存储所有货币值吗?

  • 如何处理前端行为作为某种货币的价格范围过滤器,但仍然能够正确地在数据库中查找产品?

  • 我应该创建一个cron来按今天的价格重新转换所有价格吗?

2 回答

  • 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 )
    );
    

    关于设计的一些很好的功能是,您可以将历史汇率保持在与当前汇率相同的表格中,并且不需要每日更新 . 仅在费率更改时或当费率变化足以触发更新时才进行输入 . 查询返回在给定日期生效的汇率,即使该汇率是由一个有数周的条目(在今天的货币市场中不太可能) Build 的 .

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

    因此,您只需存储产品的价格和货币 . 定价为2000日元的产品的欧元价格可以根据有效的转换率(例如订单当天)进行转换 .

  • 2

    将原始价格保存为原始货币 . 您的最后一个问题是业务决策,而不是技术决策,所以不要指望这里的答案 .

    Option 1

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

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

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

    Option 2

    如果你 do not need flexibility 或者你很少会改变汇率 - 再次,将价格保存在原始货币中,但也以统一货币的价格保存.3035904_ . 如果您不太关心标准化,可以在单独的表或新列中执行此操作 . 再次,通过修改边界并与预先计算的统一价格进行比较来进行搜索,以利用索引

相关问题