【问题标题】:Yesod/Persistent best way to store a RatioYesod/Persistent 存储比率的最佳方式
【发布时间】:2016-05-26 20:24:30
【问题描述】:

我一直在思考如何利用Ratio 类型的优势,在像货币计算这样的计算中不丢失精度,在我看来这是一个非常合理的方法。 我的问题是,考虑到我的后端将是 MySQL,将它与 Persistent 一起使用的好方法是什么。我曾考虑将其保存为 varchar,然后将其传递给函数以获取 Ratio,但我认为这可能是更好的方法。

【问题讨论】:

  • 您是否打算执行任何需要将比率视为数字的查询? Like SELECT * FROM table WHERE amount > 10
  • @xnyhps,我认为分子/分母方法适用于这种查询。但是,让数据库按该值正确排序结果可能会更困难。
  • @xnyhps 我认为现在我不知道,但如果可以的话会很好,因为想象一下我将使用外部工具来创建报告,比如 Jasper Reports,它对我可以通过多种方式在 SQL 而不是 Java 中进行此类比较
  • 如果我使用 varchar,我可以使用程序将它们转换为数字,以进行比较,也可以使用程序进行加减等...你不觉得吗?
  • 您也可以考虑使用定点数,这相当于为您的所有值选择一个分母。

标签: haskell yesod


【解决方案1】:

假设您有办法存储您用作Ratio 后端的任何数字类型,您可以使用以下三个函数将Ratio a“序列化”为它的组成a 值并返回:

(%) :: Integral a => a -> a -> Ratio a
numerator :: Integral a => Ratio a -> a
denominator :: Integral a => Ratio a -> a 

【讨论】:

  • 所以,我将有一个分子和一个分母来表示比率类型,例如,我可以在 MySQL 中使用整数类型。下一个问题,我想将它保存在一个字段中,我考虑过创建表并使用外键的选项,但我认为这样的事情太多了......我将如何存储分子和分母在一个单一的领域有效率吗?
  • @FtheBuilder 就个人而言,我建议重新考虑将其保存在单个字段中的目标。这实际上比使用两个字段有什么优势?
  • 我会重新考虑,我之所以制定这个目标是因为(如果我使用例如 Ratio 的表格进行标准化),即使我只想将格式化的货币值打印到屏幕......但我发布这个问题正是为了获得更好的方法。另一件事是通过在每种情况下使用 amountNumerator 和 amountDenominator 来避免标准化,这将是一种模式并且看起来不太好
  • @FtheBuilder 我承认我不是数据库专家;但我不清楚为什么规范化会产生一个单独的分数表,而不仅仅是两列。那里没有数据冗余,除非您希望分数在行之间有别名 - 在这种情况下,无论您使用什么表示形式,您都需要一个单独的表。
  • @FtheBuilder 单行中的所有列都密切相关。这就是为什么它们被称为关系数据库的(部分)原因。
猜你喜欢
  • 2013-04-18
  • 2015-03-23
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多