在Django/Postgres应用中的数据挖掘

21 投票
2 回答
4777 浏览
提问于 2025-04-17 07:20

我需要在我的Django应用中建立一个分析系统(包括报告、图表和图形)。理想情况下,我可以直接从Postgres数据库查询到我想要的数据,但当数据库中的数据量暴增时,我会遇到性能瓶颈和其他问题,比如索引混乱。

我想知道你能不能给我一些建议,帮助我实现这个:

  • 在这种情况下,使用像CouchDB、MongoDB或Redis这样的NoSQL数据库来查询数据是否合适?
  • 因为Postgres和Django不支持OLAP/MDX,我是否应该在另一个数据库中使用星型模式,并从中查询数据?

我希望避免两件事:

  • 我不想直接查询我的实际数据库来进行分析,因为这可能会导致性能大幅下降。
  • 我希望我的分析数据尽可能保持最新,也就是说,我希望逐步更新我的数据仓库,以便拥有最新的数据。每当我的事务数据库进行增删改查操作时,我都想更新数据仓库。

这是我还没有接触过的情况,我正在努力理解最快和最好的实现方法。

希望我说得够详细。如果不够,我很乐意再解释更多。

谢谢大家


经过在网上查找和利用我已有的知识,我得出了这个解决方案:

使用Postgres来存储关系数据。在每次增删改查操作时,调用分析代码对数据进行计算,并将结果存储在像Redis或CouchDB这样的NoSQL数据库中。

根据这个关于NoSQL数据库的比较(http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis),我认为Redis或CouchDB非常合适,专门用于分析。

我可以将计算后的分析数据存储在Redis或CouchDB中,并在源数据发生变化时逐步更新它们。

这个解决方案好吗?

2 个回答

2

抱歉,Mridang Agarwalla,有时候你的问题会让我想起...

我想到了一个方法,可以让OLAP和OLTP两个数据库保持同步,而且对OLTP的影响很小。

在2002年,我成功地用这个方法解决了类似的问题。它的工作原理如下:

  1. 你为每个事实表写一个触发器。当事实数据被修改时,触发器会在一个表中插入一行,记录这个事件(包括事件ID + 更新 | 删除 | 插入 + 指向事实表的外键)。
  2. 一个低优先级的守护进程会进行无限循环,每次循环时从表中“取出”10个事件,并用这些新信息更新OLAP数据库。

你可以优化守护进程的行为,比如如果表中没有新事件,守护进程可以休眠15秒。

在我的场景中,只有事实表有触发器。如果事实表引用的数据在OLAP数据库中不存在,我会在这个时候创建这些数据(OLTP和OLAP的结构是不同的)。

如果你分析一下你的数据库,你会发现有成百上千的表,但实际上只有少数几个表是真正的事实表。

好吧,我知道这只是你问题的部分答案。你问题的第二部分提到了一个强大的数据分析工具。我不能给你推荐任何开源产品(因为我没有使用开源分析工具的经验)。我曾经使用过Microsoft Analysis Services和Tableau软件作为前端。这是一个很不错的解决方案,但我不知道它是否符合你的理念。对于数据挖掘,你可以使用KNIME(康斯坦茨信息矿工),这是一个用户友好且全面的开源数据集成、处理、分析和探索平台(但你需要先进行ETL任务)。

请告诉我你的项目进展,我非常感兴趣。我有一个django学生考勤解决方案,我想添加分析功能。

10

你可以考虑一下Cube。虽然它不是一个Django应用,但里面有很多很不错的功能,而且Django可以很方便地和它进行沟通。而且,它的界面也很漂亮。

Cube截图

你可以让你的Django应用在事件发生时直接把信息发送到MongoDB。这样分开系统的话,可以减轻你Django应用的负担。

撰写回答