【发布时间】:2014-07-25 17:15:40
【问题描述】:
我想在第一个模型引用的模型中存储模型的一些信息。
考虑我有这些类(省略 ID)
class Student:
currentClassroom = ForeignKey(Classroom)
age = Integer
class Classroom:
totalAgeOfStudents = Integer
因此,如果我将学生添加到教室,那么它的教室也应该更新。在更复杂的情况下,考虑我们还有 Campus、City 和 Province。因此,当一个学生被添加/更新时,新旧教室、教室的校区、校区所在的城市和所在城市的省份也应该更新。这些模型的获取频率很高,因此在这里计算每个请求是不可能的。
在我迁移到 node.js 之前,我曾经在 django(使用 MySQL)中做这样的事情: 每个模型都有一个“计算”方法。每当更新学生时,在此计算方法中,旧教室和新教室都会被标记为脏教室。之后,处理标记为脏的模型,调用它们的计算方法,并相应地设置它们的字段(例如,它们通过查询学生表来计算学生的总年龄),然后如果其他模型也应该改变,它们标记它也很脏。以此类推。
我不认为这种方法很好。我在 django 中尝试了保存/删除/更新钩子(猫鼬也有保存/删除钩子),但情况没有改变:每当我收到一个学生的事件时,我首先更新他/她教室的字段,然后触发教室对应的事件等等。
在猫鼬中有没有更好的方法更有效更好?
赏金编辑:我知道在我的示例中,我可以将教室标记为脏,然后使用 MongoDB 的聚合方法来计算相关字段。我要求更好的方法。
【问题讨论】:
-
如果有人要投反对票,他/她至少应该解释他/她的理由。
-
什么是“好”、“不好”、“有效”和“无效”(以及“更有效”)?您似乎在描述一种通用且不可避免的方法:“重新计算相关信息”。 (如果你遗漏了任何东西,它是“最好是渐进式的”。)我们如何描述“不同”和“更好”的东西?如果你从这个描述中为你的旧方法申请专利......要求某人实施它......你认为它是什么以及它的优点和缺点在这里清楚吗? (反问。回答:不。)这个不好的“这个”是什么?这不是什么“好”?
-
nice -> 不涉及低级数据库触发器,即。在服务器代码本身中完成这项工作。有效-> 快速,正如您所说,这意味着最好是渐进式的。我认为对我的旧 django 实现的解释不是不可理解的,尽管太笼统了。为了澄清,我问是否有更快/更好的实现可能。例如,使用 redis 服务器进行 sum 计算。 redis 服务器将存储汇总字段,当发生更改时,相应的 redis 条目会更改(或删除以重新计算)。