2011-12-05 53 views
0

我需要存儲大量金融時間序列數據,其中不同的數據點可能具有不同的屬性。具有異構屬性的金融時間序列數據最適合的數據庫技術是什麼?

例如,考慮數據庫需要存儲包含股票和期權的金融工具時間序列的情況。股票和期權在任何給定的時間點都有價格,但期權有附加屬性,如希臘(delta,gamma,vega)等。

關係數據庫在這裏看起來最合適,一種可能性是創建一個按屬性列,並將未使用的屬性設置爲NULL。所以在上面的例子中,對於代表股票的記錄,您只會使用一些列,對於選項您可以使用其他的一些列。

這種方法的問題是效率非常低(最終會存儲大量的NULL),並且它非常不靈活(每次添加或刪除屬性時都需要添加或刪除列)。

一種替代方案可能是將所有屬性存儲在一個垂直表(即鍵名稱值)中,但它的缺點是迫使您使所有屬性類型不安全(例如,它們可能全部存儲爲字符串) 。

我想到的另一個選擇可能是將屬性作爲XML文檔存儲在時間序列表的單個列中。我測試了這種方法,從性能角度來看這是不切實際的。如果要爲任何大量時間系列記錄提取屬性,解析每行中的XML太慢。

理想的數據庫技術將是NoSQL和RDBMS之間的組合,其中關鍵時間戳對的行爲與關係表格數據庫中的行相似,但所有屬性均存儲在行級包中,並且可以快速訪問每個行。

有人知道這樣的系統嗎?是否有其他建議來存儲我描述的數據類型?

+0

空在數據庫中不佔空間,因此效率不高。你有沒有考慮過,例如每個屬性/屬性組的表?它會加快查詢時間而不是垂直查詢時間,如果您想添加某些內容,則無需更改可能正在使用的表格。 – Ben

+0

EAV表對於類型安全以及排序/搜索(在索引中通常順序的事情可能不會影響性能)是可怕的。(有意義的)執行外鍵關係也是不可能的 - 您可以關閉'key'-'name'列,但是不能**要求**該值是有效的......我不在乎如何你好,最終會發生一些事情。我不知道有什麼特別的,但我認爲我看到的東西是混合動力系統。否則,按照建議,我會轉向Master/Child表格。 –

回答

1

不同的選項。 主表與類似對象的屬性的附屬表(認爲面向對象的繼承)。根據主表的主鍵作爲相關主鍵,主和副之間有1-1關係。

+0

每個屬性或屬性組(master-child)都有一個單獨的表格,但管理查詢的複雜性顯着增加,因爲現在您需要知道哪個表要查詢每個屬性的屬性(LEFT JOIN跨所有屬性) 。它當然有用,但並不理想。 我知道在關係數據庫中處理這個問題的各種方法。然而,我覺得在這種特殊情況下RDBMS是錯誤的工具,並且想知道是否有人遇到過任何不同的東西。 –

+0

你很正確。如果我重新閱讀標題,我不會迴應......但我看了一下問題,並看到:是否有其他建議來存儲我所描述的數據類型?並認爲這是一個建議;只是不是一個好的,偉大的或理想的。這是合理的。 – xQbert

2

使用「financial_instruments」存儲所有金融工具通用的信息。使用「股票」來存儲僅適用於股票的屬性; 「選項」存儲僅適用於選項的屬性。

create table financial_instruments (
    inst_id integer primary key, 
    inst_name varchar(57) not null unique, 
    inst_type char(1) check (inst_type in ('s', 'o')), 
    other_columns char(1), -- columns common to all financial instruments 
    unique (inst_id, inst_type) -- required for the FK constraint below. 
); 

create table stocks (
    inst_id integer primary key, 
    inst_type char(1) not null default 's' check (inst_type = 's'), 
    other_columns char(1), -- columns unique to stocks. 
    foreign key (inst_id, inst_type) references financial_instruments (inst_id, inst_type) 
); 

create table options (
    inst_id integer primary key, 
    inst_type char(1) not null default 'o' check (inst_type = 'o'), 
    other_columns char(1), -- columns unique to options; delta, gamma, vega. 
    foreign key (inst_id, inst_type) references financial_instruments (inst_id, inst_type) 
); 

爲了簡化編程工作,您可以構建可更新的視圖,將「financial_instruments」與每個子類型相連接。應用程序代碼只能使用視圖。

存儲有關所有金融工具相關信息的附加表將設置「financial_instruments」。「inst_id」的外鍵引用。痛飲有關正義股票的相關信息的表格會設置一個外鍵引用「股票」。「inst_id」。

+0

有道理,但我覺得你正在將自己繪成一個角落(儘管一個更大的角色,我承認:-))。畢竟,不同的股票記錄也有可能具有不同的屬性(例如外國股票和國內股票)。這更好,但仍不理想。 我想知道是否有任何非RDBMS技術在那裏處理這種情況。 –

+0

然後,您將股票表「子類型」,並保留所有股票的共同屬性,並在新表「foreign_stocks」中放入外國股票的特有屬性,並在新的「domestic_stocks」表中將國內股票的特有屬性。在開始研究非RDBMS技術之前,理解SQL數據庫如何首先工作可能是明智的。否則,你不會有一個合適的選擇一個合適的基礎。 –

相關問題