2013-10-29 64 views
3

我想存儲1000個交易品種的股票交易數據。數據實際上是從文本文件轉換而來的,因此不需要插入和更新;只需要只讀訪問權限。針對大量數據的數據庫設計

數據基本上是這樣分組的:每個符號有很多記錄:{timestamp, price, quantity},每條記錄代表一筆交易。

一個符號的數據的近似上限爲每秒5個記錄,每個工作日爲8個小時,即每天5×60×60×8 = 144K。即1K符號每天將產生144M條記錄。

大部分在數據業務會是這樣的:

  • 給我所有記錄期間日期D1的象徵,時刻T1〜日期D2,時間T2
  • 找到一個最小值/最大值/期間的價格或數量的平均值[D1,T1 ... D2,T2]

現在的問題:這種情況下數據庫的最佳設計是什麼?

  • 我可以將符號的所有交易存儲在單個表中嗎?儘管如此,表格在這種情況下很快會變得太大。
  • 我應該每天/每週/每月創建一個單獨的表嗎?即2013-10-25_ABC(ABC - 符號名稱)。在這種情況下,我們可能會每天/每週/每月獲得1K新桌子。
  • 或者,在這種情況下可能是純文本文件就足夠了?例如,將所有符號數據作爲2013-10-15文件夾下的文件,從而在每個文件夾中產生1K個文件

該數據庫可能是MS SQL或MySQL。總時間段 - 長達5年。 謝謝!

回答

3

第三個選項是最好的1.您需要高讀取性能,幾乎可以忽略不計的寫入。

您的需求最適合於NoSql數據庫。單桌無關係; MySQL會過度殺傷。更多信息 - >NoSql Databases

2

由於您將從一個日期時間到另一個日期時間運行查詢,我根本不會拆分表。相反,請了解有關sharding的更多信息。以下是我將使用的模式:

symbols 
    id   varchar(6) // MSFT, GOOG, etc. 
    name  varchar(50) // Microsoft, Google, etc. 
    ... 

trades 
    id    unsigned bigint(P) 
    symbol_id  varchar(6)(F symbols.id) 
    qwhen   datetime 
    price   double 
    quantity  double 
    ... 
2

這是一大堆數據。看看NoSQl。

使用SQL,這裏有一些基本思路:

把所有的價格表中的數據,使用小數據類型成爲可能。使用SymbolId(int)引用符號,所需的最小日期時間類型,所需的最小貨幣類型。

做反規範化。使用每天最小/最大/平均值和SymbolId製作第二張表。

研究水平分割和使用索引。