2016-05-04 45 views
0

我正在從一個大數據項目中獲取大量的產品信息,這些產品信息是從不同的在線銷售商處收集的,如價格,標題,銷售商等(每個項目30+數據點)。要選擇大於100 mio的大數據項目的數據模型。項目

一般而言,有2個用例的項目:

  1. 顯示用於在web應用或小部件
  2. 特定產品的最新數據點分析歷史數據,例如價格歷史記錄,產品集羣,語義分析等

我首先決定使用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)
  • 重疊的產品信息子集是由分佈式爬蟲在不同的時間點取回
  • 信息應被存儲在分佈式的,可水平擴展數據庫
  • 數據冗餘應減少到最低限度
  • 時間序列有關的數據點應保留信息

我會非常感謝任何想法(數據模型/架構,不同的數據庫......),這可能會幫助我推進項目。提前感謝!

回答

1

字段/數據點是否已知和指定?也就是說,你有固定的模式嗎?如果是這樣,那麼你也可以考慮關係數據庫。

DB2有一個他們稱之爲時態數據庫的東西。在'系統'表單中,數據庫透明地處理版本控制。任何插入都會自動添加時間戳,並且每當更新一行時,前一行都會自動遷移到歷史記錄表(保留其舊時間戳)。之後,您可以在任何給定的時間點運行SQL查詢,並且DB2將返回指定時間(或時間範圍)的數據。他們還有一個「應用程序」表單,您可以在其中指定該行在插入行時有效的時間段(例如,如果價格在特定時間段內有效),但最終的SQL查詢仍然工作相同辦法。不管怎樣,所有的時間複雜度都是由數據庫管理的,你可以編寫相對乾淨的SQL查詢。

您可以通過他們的DeveloperWorks site瞭解更多。

我知道像Oracle這樣的其他關係型數據庫也有時間序列數據的特殊功能,可以爲您管理版本控制/時間戳。

至於空間效率和規模,我不知道,因爲我不跑

(OTOH,如果你沒有一個固定的模式,或者你知道大:-)任何數據庫你會有不同的數據輸入模式,你不能用稀疏表格來建模,那麼像mongo這樣的文檔數據庫可能是你最好的選擇)

相關問題