什么是最好的:几张桌子还是一张非常大的桌子?

时间:2009-11-11 03:26:36

标签: sql database-design

我想知道这件事。假设我需要在数据仓库中存储多个度量与时间的数据:

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

如果我需要以尚未定义的方式构建一些构成以前数据的大型事实表,那么可以更高效(在任何意义上说),有一个存储所有内容的大表或者像我描述的那样拥有单独的表? / p>

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

3 个答案:

答案 0 :(得分: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)

使用一个事实表。时间是事实表的维度。如果您显示的重叠,则意味着您需要另一个维度。

答案 2 :(得分:1)

您是否需要立即使用/显示所有结果?如果是这样的话,将它们全部集中在一起会更有效率,为此我会选择一张表: - )