我正在從一個大數據項目中獲取大量的產品信息,這些產品信息是從不同的在線銷售商處收集的,如價格,標題,銷售商等(每個項目30+數據點)。要選擇大於100 mio的大數據項目的數據模型。項目
一般而言,有2個用例的項目:
- 顯示用於在web應用或小部件
- 特定產品的最新數據點分析歷史數據,例如價格歷史記錄,產品集羣,語義分析等
我首先決定使用MongoDB進行水平伸縮,因爲假設項目的數據存儲在數百GB的數據範圍內,並且數據可以在很多MongoDB實例中通過MongoDB動態分割。
每個產品的30+個數據點不會一次收集,而是在不同的時間,例如,一個爬行器收集價格,幾天後另一個收集產品說明。然而,一些數據點可能會重疊,因爲兩個爬蟲收集例如產品標題。例如,結果可能是這樣的:
Document 1:
{
'_id': 1,
'time': ISODate('01.05.2016'),
'price': 15.00,
'title': 'PlayStation4',
'description': 'Some description'
}
Document 2:
{
'_id': 1,
'time': ISODate('02.05.2016'),
'price': 16.99,
'title': 'PlayStation4',
'color': 'black'
}
所以我最初想出了以下的想法(IDEA 1):
- 所有的數據點在一個特定的抓取過程中發現,在一個結束文件如上所述。要獲得最新的產品信息,我會分別查詢每個數據點,並獲取不超過某個閾值的最新條目,例如一週,以確保「用例1」的產品信息沒有過期,並且我們擁有所有數據點(因爲單個文檔可能不包含所有數據點,但只包含一個子集)。然而,由於一些數據點(例如產品標題)沒有定期改變,只是一直保存所有數據(以便能夠進行時間序列分析和高級分析)將導致數據庫中的大量冗餘,例如,即使不改變,每天也會保存相同的產品說明。因此,我想我可能會檢查數據庫中的最新值,並且只有在值已更改時才保存該值。但是,這導致了很多額外的DB查詢(每個數據點一個),並且由於上述時間閾值,我們將丟失信息,無論數據點是否沒有變化或者是否由網站所有者從網站中刪除商店。
因此,我考慮不同的溶液(IDEA 2):
- 我想在不同的文檔中分裂的所有數據點,例如價格和標題存儲在具有自己的時間戳的單獨文檔中。如果數據點沒有改變,則可以更新時間戳以指示數據點沒有改變並且仍然可以在網站上獲得。但是,這會導致小數據點的巨大開銷,例如布爾值,因爲每個文檔都需要自己的密鑰,時間戳等,以便能夠使用索引快速查找/篩選/排序它們。
例如:
{
'_id': 1,
'timestamp': ISODate('04.05.2016'),
'type': 'price',
'value': 15.00
}
因此,我在努力找到合適的型號和/或數據庫用於該項目。概括起來,這些都是要求:
- 收集的數以百萬計的產品數百種(數百GB的甚至TBS)
- 重疊的產品信息子集是由分佈式爬蟲在不同的時間點取回
- 信息應被存儲在分佈式的,可水平擴展數據庫
- 數據冗餘應減少到最低限度
- 時間序列有關的數據點應保留信息
我會非常感謝任何想法(數據模型/架構,不同的數據庫......),這可能會幫助我推進項目。提前感謝!