数据库不可知计算:存储计算结果是否合适?如果是,那么更好的方法是什么?

时间:2011-12-23 15:15:31

标签: ruby-on-rails database-design activerecord callback

我想在我的rails应用程序中保持与数据库无关的同时执行一些简单的计算。

我有三种模式:

 .---------------.       .--------------.           .---------------.
 | ImpactSummary |<------| ImpactReport |<----------| ImpactAuction |
 `---------------'1     *`--------------'1         *`---------------'

基本上:

  • ImpactAuction包含有关...拍卖的数据(价格,数量等)。

  • ImpactReport包含每月报告,其中包含许多拍卖以及其他属性;它还显示了一些基于拍卖的计算结果。

  • ImpactSummary包含一系列报告以及有关特定年份的一些信息,还会根据其他两个模型显示计算结果。

我打算做的是将相关表格中这些非常简单的计算结果(只是方法,总和等)存储起来,这样读取这些结果就会很快,而且我可以轻松地执行查询计算结果。

  1. 存储计算结果是一种好习惯吗?我很确定这不是一件好事,但是可以接受吗?

  2. 是否有用,或者我不应该费心去执行计算?

  3. 如果这是好的做法和有用的,那么实现我想要的更好的方法是什么?

  4. 这是棘手的部分。首先,我实现了一个简单的回调链,它会在保存时更新父模型的计算字段(也就是说,当创建或更新拍卖时,它在其报告上标记some_attribute_will_change!并保存它,从而触发自己的回调,依此类推)。

    这种方法在创建/更新单个记录时非常适合,但如果我想处理多个记录,它将触发每条记录的整个链上的计算......所以我突然发现自己被迫放了一个条件在回调上...取决于我是否有一个或多个记录,我无法弄清楚如何(使用可以在关系上调用的类方法?在每条记录上使用实​​例属性@skip_calculations?只使用outdated字段标记父记录以供以后计算?)。

    欢迎任何建议。

    奖金问题:如果我使用数据库视图实现此功能,是否会被视为数据库不可知?

1 个答案:

答案 0 :(得分:0)

像往常一样,这取决于。如果您可以使用视图或使用#find_by_sql在数据库中执行计算,我会这样做。您可以省去很多麻烦:在更改值时,您必须使摘要保持最新。更新多行时,您已经遇到了问题。拥有一个视图或实现在ImpactReport中存储为文本的视图的查询,将允许您始终拥有新数据。

答案是什么?基准,基准,基准;)