2017-09-15 87 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引起的開銷。
  • 很少使用的數據可以遷移到更便宜和更慢的存儲介質。

只有當表格 否則很大時,好處通常是值得的。 雖然規則 的拇指規則是表的大小應該超過數據庫服務器的物理內存 ,但分區後表 受益的確切點取決於應用程序。

正如他們所說,它取決於你的具體使用情況。最後一句可能是做出選擇的標準。

相關問題