2009-11-11 65 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

使用一个事实表。时间是事实表的一个维度。如果你有重叠,这意味着你需要另一个维度。

相关问题