0

我有两个模型 - Score& Weight

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

我需要能够weighted_score为 my创建一个User,这基本上是Score.attribute_A* Weight.attribute_AScore.attribute_B*Weight.attribute_B等的产品。

我最好创建第三个模型 - 比如说Weighted_Score,我将每个属性的产品值存储在一行中user_id,然后在我需要特定weighted_score(例如my_user.weighted_score.attribute_A)时查询该表,或者我最好只是动态进行计算每次?

我是从效率的角度来问的。

谢谢。

4

2 回答 2

1

我认为答案取决于情况。如果计算非常昂贵,则创建第三张表可能是一个好主意,您不想让系统的其余部分陷入困境,并且可以立即向用户回复一条消息,说明计算将在未来。在这种情况下,您可以将处理卸载到后台工作人员并异步创建第三个模型的实例。此外,您应该对表进行反规范化,以便您可以直接访问它,而无需查找权重/分数记录。

其他一些想法:

  1. 将优化重点放在具有许多记录的模型上。例如,如果 Weight 将只有 100 条记录,但 Score 可能是无限的,则将 Weight 加载到内存中,并将所有精力集中在优化 Score 查询上。
  2. 在 calc 方法上使用memoization
  3. 对最昂贵的操作/方法使用缓存。如果您不太关心值更新的频率,您可以每晚显式扫描缓存或其他内容。
于 2012-10-08T23:39:56.663 回答
0

除非需要存储计算的分数(假设它发生了变化并且您想保留对它的更改),否则我看不到增加复杂性以将其存储在单独的表中的任何好处。

于 2012-10-08T23:34:38.673 回答