Django存储数百万产品价格历史的最佳方式?

时间:2017-09-15 06:23:18

标签: mysql django postgresql

我正在运行一个网络抓蜘蛛,每天擦掉近100万件产品。 我正在考虑两种方法: 1)将所有产品的价格历史存储在一个表中

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

但我会有近100万张桌子!

1 个答案:

答案 0 :(得分:2)

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

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

  

分区是指将逻辑上的一个大表拆分   变成较小的物理碎片。分区可以提供几个   好处:

     
      
  • 在某些情况下,查询性能可以得到显着提高,特别是在大多数访问量很大的行时   该表位于单个分区或少数   分区。分区替代了前导列   索引,减少索引大小,使其更有可能   索引中使用频繁的部分适合内存。
  •   
  • 当查询或更新访问单个分区的大部分时,可以通过利用
    来提高性能   顺序扫描该分区而不是使用索引和
      随机访问分散在整个表格中。
  •   
  • 如果计划在分区中,则可以通过添加或删除分区来完成批量加载和删除   设计。 ALTER TABLE NO INHERIT和DROP TABLE都快得多   而不是批量操作。这些命令也完全避免了VACUUM
      批量删除导致的开销。
  •   
  • 很少使用的数据可以迁移到更便宜和更慢的存储介质。
  •   
     

只有当一张桌子出现时,这些好处通常才有价值   否则会非常大。 表格的确切位置   分区的好处取决于应用程序,虽然是一个规则   拇指是表的大小应该超过物理   数据库服务器的内存。

正如他们所提到的,这取决于您的具体用例。最后一句可能是您做出选择的标准。