Sql 什么是最好的:几张桌子还是一张很大的桌子?

Sql 什么是最好的:几张桌子还是一张很大的桌子?,sql,database-design,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 如果我需要构建一些大型事实表,以尚未定义的方式组成以前的数据,那么有什么更有效(无论从何种意义上讲),让一个大型表存储所有内容,还是像我所描述的那样让单独的表更有效

我想知道这件事。假设我需要将数据存储在数据仓库中,用于几个度量值和时间:

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 |     | 

是否需要一次使用/显示所有结果?如果是这样的话,将它们全部收集在一起会更有效,为此,我将使用一个表:-)

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

如果您谈论的是动态列数(即每次添加另一个x''n时添加一个新列),那么这实际上不是关系数据库的处理方式。向大型表中添加列是一种效率非常低的操作。根据您的RBDM,执行此操作时,它可能会复制并重新创建整个表。动态创建新表的速度更快,但仍然不如插入行快,而插入行正是关系数据库发挥最佳性能的地方。基本上我想说的是,您希望您的数据库模式是静态的(或者很少改变)。所有动态操作都应该完全基于行

也许你真正想要的是这样一张桌子:

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
子句中的列上创建索引(或者根据查询表的确切方式创建一些战略性复合索引)。另外,最好将主键列作为每个表的第一列,因为如果需要更新或删除行,它将为您提供单个行上的唯一句柄。为了简单地说明我的观点,我在上面的示例中省略了主键