Django +大型数据库:如何处理500m行?

时间:2015-03-07 20:23:39

标签: django postgresql bigdata

我正在开发一个包含大量数据的网络应用程序,并希望获得一些通用的技术堆栈建议。我是Django开发人员,但之前我还没有处理过这么多数据。

对一般性问题抱歉,但我非常感谢一些一般性的建议。如果它真的不适合SO,而不仅仅是投票关闭它,我真的很感激建议一个论坛,我可以请求这个建议。

我的数据库将有三个表,其中一个表将有大约500米的行(100GB的数据)。数据是只读的,每月只更改一次。

大表(500米行)是过去五年每个月的消费项目,其他表是消费(约10万行)和购买物品(约4000行)的机构。模型基本上如下所示:

class Organisation(models.Model):
    name = models.CharField(max_length=200)

class SpendItem(models.Model):
    name = models.CharField(max_length=200)

class Spend(models.Model):
    spend_item = models.ForeignKey(SpendingItem)
    organisation = models.ForeignKey(Organisation)
    spend_value = models.FloatField()
    processing_date = models.DateField()

我需要在网络应用中提供以各种方式汇总这些支出数据的网页。例如,我可能希望显示每个机构的页面,每个月的总支出以及每种项目的总支出。或每个项目的页面,总花费和机构支出。

我最初的计划是拥有一个Postgres后端,因为我知道数据的形状,只需通过Django ORM进行查询,或者在必要时通过原始SQL进行查询。

但是我开始担心:聚合查询会在超过500米的行上慢得多吗?我是否需要预先计算所有聚合查询?我是否还应该研究以前没有使用过的其他技术,比如Elasticsearch,甚至是BigQuery?

另一个问题:这个大小的Postgres数据库(大概是带有索引的200GB)可能会以可接受的速度从SSD运行,还是需要支付足够的RAM来将其全部保存在内存中? (Eeeek。)

我知道答案真的是“尝试并看到”,但我非常感谢来自更有经验的Django / Postgres /数据开发人员的任何前期建议。如果您正在处理这种形状的应用程序,您将如何处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

我可能已经非常清楚地理解了这个问题,但这就是我如何理解它。

  • 我不会将elasticsearch / solr的开销用于计算聚合,(在我看来,当你需要FTS,排名和东西时它很有用)
  • 我希望在processing_date上有一个索引,并为last_indexing_datelast_aggregate另外两个字段(可能在每个组织中)并使用一些后台异步任务定期更新这些字段。
  • 对于实时详细信息,我只需选择last_indexing_date并在该日期之后运行汇总汇总,最后将其与last_aggregate相加并更新这些字段。

不确定你的意思:

  

创建一个可用的网络应用程序,为这些用户提供此信息

希望这会有所帮助:)