在数据库上预先计算字段以避免深度连接查询是个坏主意吗?

Is having precalculated fields on the database to avoid deep join queries a bad idea?

我的应用程序中有这个数据模型 (Django/Rest Framewrok)。它主要列出和操作 ProjectRelease 类,每个受影响的系统有多个实例,每个实例有多个阶段,每个阶段具有不同的努力。

我正在为前端开发 RESTful API,但在为 发布,或所有活跃的项目。我需要转到 ProjectInstancePhase 以获得 Project o Release 元素的总体工作量。

在依赖对象更新时更新的项目或发布对象的预先计算值是否是个坏主意?我知道它破坏了数据库的规范化,但它会节省很多时间。考虑列出 300 个项目和所有相关数据。

我考虑过缓存,但我需要经常使它失效,因为需要显示相关 类 中的任何更改。

是否有一些 ORM 技巧可以降低数据库的负载?

所有教程和示例通常都依赖于简单的数据模型,这些模型很少反映现实生活中的复杂项目,因此我没有找到这个主题。

非常感谢。

                                       *Listed               *Listed
+--------+       +------------+      +-----------+         +----------+
| Person +>-----<+ Participant+>----<+  Project  +>-------<+ Release  |
+--------+       +------------+      +-----------+         +----------+
                                          v
                                          ^
                 +--------+      +-----------------+
                 | System +>----<+ ProjectInstance |
                 +--------+      +-----------------+
                                          v
                                          ^
                               +----------------------+        +--------------+
                               | ProjectInstancePhase +>------<+ ProjectPhase |
                               +----------------------+        +--------------+
                                       *Effort

我经常使用这种方法。您可以使用 Django 的信号来更新预先计算的字段(甚至某些专用模型的预先计算的实例)。

此外,您甚至可以仅在特定情况下执行一些更新(例如,字段 a 将其值从正数更改为负数等 — 在重写的 .save() 方法中,有可能可以访问更新前的所有实例字段值,并将它们与更新后的值进行比较。

如果您需要示例,请告诉我。