我想在第一个模型引用的模型中存储模型的一些信息。
考虑我有这些类(省略了ID)
class Student:
currentClassroom = ForeignKey(Classroom)
age = Integer
class Classroom:
totalAgeOfStudents = Integer
因此,如果我将一名学生添加到教室,那么它的教室也应该更新。在更复杂的情况下,请考虑我们还有校园,城市和省。因此,当学生被添加/更新时,它的新旧教室,教室的校园,校园等都会被添加/更新。城市和城市的省份也应该更新。这些模型经常被提取,因此在这里计算每个请求是不可能的。
在迁移到node.js之前,我曾经在django(使用MySQL)中做过类似的事情: 每个型号都有一个'计算'方法。每当学生更新时,在这种计算方法中,它的旧教室和新教室都被标记为脏。之后,处理标记为脏的模型,调用它们的计算方法,相应地设置它们的字段(例如,它们通过查询学生表来计算学生的总年龄),然后如果其他模型也应该更改,则标记它也很脏。等等。
我不认为这种方法很好。我在django中尝试了保存/删除/更新挂钩(mongoose也有保存/删除挂钩),但情况并没有改变:每当我收到学生的活动时,我首先更新他/她教室的字段,然后触发教室的相应事件等等。
对于更有效和更好的猫鼬有更好的方法吗?
Bounty编辑:我知道在我的例子中,我可以将教室标记为脏,然后使用MongoDB的聚合方法来计算相关字段。我要求更好的方法。
答案 0 :(得分:0)
tl; dr:通过确定其组合表达式上的dag然后从基表的(部分)到共享子表达式到各种输出表(或部分)的dag顺序进行评估来更新您的摘要(或其他)基表)。增量值得的地方。
该标题......"存储反向外键的数据"
外键有一定的方向感。但它描述了一个约束。约束是关于数据库的真相。对应于外键约束的命题是关于表含义的含义( - >)和关于表值的包含(< =)。这是一种逻辑/算术方向性。但它与查询无关。 FK声明/存在可能表明两个表将倾向于连接(并且如果它们将有助于优化),但声明的FK与任何特定查询的结果或子表达式依赖于每个表的顺序无关。其他或基表。但这些是您正在更新的聚合等的相关依赖项。
根据组成表的含义,外键与查询的含义无关。正确规范化的数据库没有方向。忽略交换运算符的任意排序和确认等效重排的查询表达式可以被视为(部分)内部排序,即离开。一组查询,因为它们可以共享子表达式,定义一个定向的acylic图,顶部的最外层查询运算符和底部的基表值。您应该通过这个图表进行评估。这应该尽可能增量,值得付出努力。例如,如果您知道少数人改变了债务的变化,那么您不需要重新计算所有学生的债务总额。
因此,如果您的方法 - 除了最一般的术语以及您的其他非常规标题所暗示的内容之外完全不清楚 - 涉及跟随外键,请不要这样做。 关注数据。从基础到查询结果。 FK仅与此相关,因为它们可能影响要评估的最佳dag是优化表达式共享。 (DBMS会优化同步查询。)
当您澄清您的问题时,请说明您的标题和FK特别是如何与您的问题有关。虽然也许你认为它们的相关性与你的不满有关。换句话说,您寻求的重新计算顺序应该是每个查询而不是FK。