2017-09-15 76 views
0

我正在运行一个网络抓取蜘蛛,每天抓取近100万个产品。 我正考虑2点的方法: 1)本店所有商品价格的历史在一个表中Django最好的方式来存储数百万产品的价格历史?

product_id, date, price 

,但这将在此表产生多万条记录。

2)将数据存储在多个表中&为每个产品制作单独的表格。

Table1: product_id, current_price 
Table_product_id: date, price 
Table_product_id: date, price 
Table_product_id: date, price 

但是我将有近一百万张桌子!

+0

为什么你会考虑第二种选择的任何原因? –

回答

2

从理论的角度来看,您应该使用相同的模式来存储相同实体的实例(例如,您的产品类型)。据此,解决方案1应该是首选。

在现实世界中,高数据基数可能是一个问题。例如,MongoDB,使用sharding来管理非常大的数据集。 PostgreSQL允许partitioning。从PostgreSQL的文档:

分区是指将逻辑上一个大表 分成更小的物理片段。分区可以提供若干 好处:

  • 查询性能可以显着地在某些情况下得到改善,特别是当大部分 表重访问的行的是在一个单一的分区或少数 分区。分区替代了索引的前导列,从而减少了索引大小,并使索引中大量使用的部分更适合内存。
  • 当查询或更新访问单个分区的很大比例,性能可以通过采取
    该分区的顺序扫描的优势,而不是使用分散在整个表的索引和
    随机访问读取得到改善。
  • 可以通过添加或删除分区来完成批量加载和删除操作,如果该需求计划划分为
    设计。 ALTER TABLE NO INHERIT和DROP TABLE都比批量操作要快得多
    。这些命令也完全避免了批量DELETE引起的开销。
  • 很少使用的数据可以迁移到更便宜和更慢的存储介质。

只有当表格 否则很大时,好处通常是值得的。 虽然规则 的拇指规则是表的大小应该超过数据库服务器的物理内存 ,但分区后表 受益的确切点取决于应用程序。

正如他们所说,它取决于你的具体使用情况。最后一句可能是做出选择的标准。