在 django 中使用物化视图或替代方案

Posted

技术标签:

【中文标题】在 django 中使用物化视图或替代方案【英文标题】:using materialized views or alternatives in django 【发布时间】:2015-06-25 08:29:25 【问题描述】:

我需要在我的django 应用程序中使用一些经常更改的aggregate 数据,如果我进行动态计算,可能会出现一些性能问题。因此,我需要将aggregate 结果保存在表格中,并在数据更改时更新它们。因为我使用django,有些选项可能存在,有些可能不存在。例如,我可以使用django signals 和一个表,当post_save 信号发出时,它会更新结果。另一种选择是materialized views in postgresqlindexed views in MSSQL Server,我不知道如何在django 中使用或者django 是否支持它们。在django 中执行此操作以提高性能和结果准确性的最佳方法是什么。

【问题讨论】:

您可能必须通过 rawsql 查询来使用它们。 @wobbily_col 如何使用 django 信号或编写一些函数来更新结果? 问题是(据我所知)您不能真正将 Django 模型映射到物化视图。如果您在数据库中使用它们,您将不得不使用原始 sql 与它们进行交互。如果您正在使用函数,您仍然必须以某种方式与数据库对话,要么通过带有模型的标准 django ORM,要么通过原始 sql。对您实际尝试实现的目标进行更详细的描述会很有用。 @wobbily_col 我有三个相关的表,每个表都有一个 number 字段,当将新记录添加到这些表之一或其中的 number 字段时,将更新 number 字段的总和在每个表中都应该更新以保持平衡。这些表之一与用户模型有关,我需要保持用户相关活动(number 字段的总和)处于跟踪状态。我希望我的观点。如果您需要任何额外信息,请告诉我。 @wobbily_col 你对使用 raw_sql 或其他方式是正确的,但问题是我想找出最简单和最好的方法。 【参考方案1】:

您可以在 postgres 中使用物化视图。这很简单。

    您必须使用CREATE MATERIALIZED VIEW my_view as select * from my_table; 之类的查询创建一个视图

    创建一个包含两个的模型 Meta 模型中的选项 managed=falsedb_name=my_view 喜欢 这个

    MyModel(models.Model): class Meta: managed = False db_table='my_view'

    只需使用 ORM 的强大功能并将 MyModel 视为常规模型。例如MyModel.objects.count()

【讨论】:

我采用了这种方法,并且大部分时间都有效。但是,当设置从另一个模型到附加到视图表的模型的外键关系或 OneToOne 关系时,我收到以下错误:django.db.utils.ProgrammingError: referenced relation "MaterializedViewTableName" is not a table 刷新您的视图并重试。或分享您创建视图查询。

以上是关于在 django 中使用物化视图或替代方案的主要内容,如果未能解决你的问题,请参考以下文章

我想要“实时物化视图”,其中包含任何行的最新信息

什么是物化查询或视图?它在 ORM 世界中的位置在哪里?

视图 VS 物化视图

PG 物化视图

Redshift 物化视图不刷新或删除

ORA-08103: 对象不再存在 - 物化视图