在 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 postgresql
或indexed 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=false
和 db_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 中使用物化视图或替代方案的主要内容,如果未能解决你的问题,请参考以下文章