我正在开发一个包含大量数据的网络应用程序,并希望获得一些通用的技术堆栈建议。我是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>
答案 0 :(得分:0)
我可能不已经非常清楚地理解了这个问题,但这就是我如何理解它。
processing_date
上有一个索引,并为last_indexing_date
和last_aggregate
另外两个字段(可能在每个组织中)并使用一些后台异步任务定期更新这些字段。last_indexing_date
并在该日期之后运行汇总汇总,最后将其与last_aggregate
相加并更新这些字段。不确定你的意思:
创建一个可用的网络应用程序,为这些用户提供此信息
希望这会有所帮助:)