2009-11-11 101 views
2

我在想這個。比方說,我需要在一個數據倉庫的幾個小節的數據存儲與時間:什麼是最好的:幾張桌子還是一個很大的桌子?

t | x' 
------- 
1 | 20 
2 | 50 
3 | 30 


t | x'' 
------- 
3 | 23 
4 | 56 
6 | 28 

等..

t | x''n 
------- 
5 | 35 
6 | 92 
7 | 23 

如果我需要建立一些大的事實表組成之前的數據中尚未定義的方式,什麼可以更有效率(無論如何),有一個大表存儲所有內容或者像我描繪的那樣有單獨的表格?

t | x' | x'' 
---------------- 
1 | 20 | 
2 | 50 | 
3 | 30 | 23 ... 
4 |  | 56 
5 |  | 28 
6 |  | 
7 |  | 

回答

5

如果你在談論擁有動態數量的列(即每次添加另一個x'n時添加一個新列),這實際上不是關係數據庫的做事方式。將列添加到大型表是一個非常低效的操作。根據你的RBDMS,當你這樣做時,它實際上可能會複製並重新創建整個表格。動態創建新表格的速度更快,但仍然不如插入行,這是關係數據庫真正發揮最佳性能的行。基本上我所說的是你希望你的數據庫模式是靜態的(或者很少改變)。所有的動態操作都應該是純粹基於行的。

也許你真正想要的是一個表是這樣的:

t | x | prime 
---+----+------ 
1 | 20 | 1 
2 | 50 | 1 
3 | 30 | 1 
3 | 28 | 2 
4 | 56 | 2 
6 | 28 | 2 
5 | 35 | 3 
6 | 92 | 3 
7 | 23 | 3 

確保創建的列的索引,將在您的疑問出現在WHERE條款(或可能取決於如何一些戰略性複合索引正好你會查詢表格)。此外,最好將主鍵列作爲每個表的第一列,因爲如果您需要更新或刪除它們,它將爲您提供單個行上的唯一句柄。爲了簡化說明我的觀點,我在上面的示例中省略了主鍵。

1

您是否需要一次性使用/顯示所有結果?如果是這樣,將它們全部抓在一起會更有效率,爲此,我將使用一張表:-)

3

使用一個事實表。時間是事實表的一個維度。如果你有重疊,這意味着你需要另一個維度。

相關問題