2013-11-10 27 views
3

我想知道如果你認爲這是合理的,使用monetdb(或另一個列式數據庫)將所有數據放在一個大的平坦表中,而不是將它分解成幾個相關的表。使用類似MonetDB的列式數據庫來避免維度建模?

例如,二手車,平的數據庫,可能看起來像:

Make Model Year Color Mileage 
Chevy Malibu 2009 orange 102100 
Chevy Malibu 2009 orange 98112 
Chevy Malibu 2008 orange 210232 
Chevy Malibu 2009 pink  150100 

注意到在化妝示範歲的顏色冗餘,在SQL數據庫或Excel電子表格或什麼的,你可能有兩個表所示:

mId Make Model Year Color 
1  Chevy Malibu 2009 orange 
2  Chevy Malibu 2008 orange 
3  Chevy Malibu 2009 pink 

mId Mileage 
1  102100 
1  98112 
2  210232 
3  150100 

這有助於在更復雜的查詢費用的冗餘和不必考慮如何分解(分手)的表。

我正在閱讀關於柱狀數據庫和monetdb特別。看起來好像,因爲monetdb單獨壓縮列,所以冗餘無關緊要,您可以使用扁平表,期望相同或更好的性能(查詢時間,磁盤使用率),這是一個良好分解的關係表集合。這可以節省設計工作量,但通過避免它,甚至可以讓您完全自動化模式設計。

您認爲如何?有沒有我看不到的隱藏成本?

+0

SQL Server,Oracle等也都可以壓縮數據,往往很好。這個問題通常不是規模,甚至不是性能,這是通過建立未正確規範化的模型不可避免地引入的邏輯錯誤。面向列的數據庫非常棒 - 用於分析,而不是事務處理。列壓縮在那裏是有益的,因爲星形和雪花模式預計會有很多列,每列都有很多行的相當窄的列。但是這些模式對OLTP來說是非常糟糕的選擇。 – Aaronaught

+1

我可以有你當前的觀點,因爲我也在研究用柱狀數據庫替換/使用星型模式設計的方法。任何幫助材料,你可以參考。 –

+0

爲正確的用例創建了列數據庫。這些用例與我們目前在關係規範化數據庫中的用例不同。我們無法將所有內容都放在柱狀數據庫中。列式數據庫不適用於需要頻繁更新的數據。 – v83rahul

回答

0

好像你說得對。 在我的經驗中,一般來說Columnar數據庫和MonetDB特別提供了非常快速的數據結構查詢時間,就像您所描述的那樣。 對於你描述的例子,一個Columnar數據庫將對每一列進行編碼和壓縮(自然包含相同類型的數據,並且有很多重複)。

無論如何,如果您的工作負載包含很多更新,請在決定之前對解決方案進行基準測試。

就個人而言,我認爲MonetDB比大多數商業面向列的數據庫表現要好得多,並且要好得多,但面向行或NoSQL要好得多,但要牢記的是,每個案例都有自己的行爲。

0

你所描述的是(a.f.a.i.k.),叫做「統一表法」。非常聰明的人試圖圍繞這個想法實施系統,並放棄了這個想法。最新(不成功)的嘗試是IBM DB2 Blink Project(請參閱http://homepages.cwi.nl/~idreos/BlinkDebull2012.pdf的第3頁)。本質:從查詢處理的角度來看,您通常會更好地使用規範化模式,而不是讓系統爲您找出您的模式。爲了回答你的具體問題:MonetDB不壓縮字符串以外的數據(甚至只有少數唯一的字符串時)。我建議你花費精力去定義一個關係模式,或者如果你真的做不到,則轉換到一個無模式DBMS。這當然會導致性能損失。