如果我有两个模型并需要对每个属性进行计算,我应该动态计算还是创建第三个模型?

时间:2012-10-08 23:18:45

标签: ruby-on-rails ruby-on-rails-3

我有两个型号 - Score& Weight

这些模型中的每一个都有大约5个属性。

我需要能够为weighted_score创建User,这基本上是Score.attribute_A * Weight.attribute_AScore.attribute_B * {{的产物1}}等等。

我最好创建第3个模型 - 比如说Weight.attribute_B,我用Weighted_Score将每个属性的产品值存储在一行中,然后在需要特定{{}}时查询该表。 1}}(例如user_id)或者我最好每次都在进行计算吗?

我从效率的角度提出要求。

感谢。

2 个答案:

答案 0 :(得分:1)

我认为答案非常依赖于情境。创建第三个表可能是一个好主意,如果计算非常昂贵,您不希望陷入系统的其余部分,并且您可以立即响应用户并显示计算将在未来。在这种情况下,您可以将处理卸载到后台工作程序中,并异步创建第3个模型的实例。此外,您应该de-normalize the table,以便您可以直接访问它,而无需查找权重/分数记录。

其他一些想法:

  1. 关注具有许多记录的模型的优化。例如,如果Weight只有100条记录,但Score可以有无限,那么将Weight加载到内存中,并集中精力优化Score查询。
  2. 对calc方法
  3. 使用memoization
  4. 对最昂贵的操作/方法使用caching。如果您不太关心值更新的频率,您可以每晚明确地扫描缓存或其他内容。

答案 1 :(得分:0)

除非需要存储计算得分(假设它已更改并且您希望保留对其的更改),我不会看到添加复杂性以将其存储在单独的表中的任何好处。