我正在开发一个包含大量数据的网络应用程序,并且想要一些一般的技术栈建议。我是一名 Django 开发人员,但我以前从未处理过这么多数据。
对于一般性问题深表歉意,但我非常感谢一些一般性建议。如果它真的不适合 SO,而不是仅仅投票关闭它,我真的很感谢对一个论坛的建议,我可以在其中征求此建议。
我的数据库将包含三个表,其中一个表将包含大约 5 亿行(100GB 数据)。数据是只读的并且很少更改,每月仅一次。
大表(5 亿行)是过去五年每个月的支出项目,其他表是进行支出的机构(约 1 万行)和购买的项目(约 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()
我需要在 Web 应用程序中提供页面,以各种方式查询汇总此支出数据。例如,我可能想为每个机构显示一个页面,其中包含每个月的总支出以及每种项目的总支出。或者每个项目一页,包括总支出和机构支出。
我最初的计划是拥有一个 Postgres 后端,因为我知道数据的形状,并且只需通过 Django ORM 进行查询,或者在必要时通过原始 SQL 进行查询以提高速度。
但我开始担心:超过 5 亿行的聚合查询会不会太慢?我是否需要预先计算所有聚合查询?我是否还应该研究以前未使用过的其他技术,例如 Elasticsearch,甚至是 BigQuery?
另一个问题:这种大小的 Postgres 数据库(大概 200GB 带索引)是否可以从 SSD 以可接受的速度运行,或者我是否需要支付足够的 RAM 以将其全部保存在内存中? (哎呀。)
我知道答案真的是“试试看”,但我真的很感谢更有经验的 Django/Postgres/数据开发人员提供的任何前期建议。如果您正在开发这种形状的应用程序,您会如何处理它?</p>
最佳答案
我可能没有非常清楚地理解这个问题,但这是我将如何处理它。
- 我不会仅仅为了计算聚合而占用 elasticsearch/solr 的开销,(在我看来,当你需要 FTS、排名和其他东西时它很有用)
- 我宁愿在
processing_date
上有一个索引,并为last_indexing_date
和last_aggregate
取另外两个字段(可能在每个组织中)并更新这些定期使用一些后台异步任务。 - 对于实时详细信息,我会选择
last_indexing_date
并汇总该日期之后的支出,最后用last_aggregate
汇总并更新这些字段.
不确定你的意思:
Create a usable web app that offers this information to those users
希望这有帮助:)
关于Django + 大型数据库 : how to deal with 500m rows?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28919599/