代码之家  ›  专栏  ›  技术社区  ›  Alex. S.

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

  •  2
  • Alex. S.  · 技术社区  · 15 年前

    我在想这件事。假设我需要将数据存储在数据仓库中,以实现几个度量与时间的对比:

    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 |     | 
    
    3 回复  |  直到 15 年前
        1
  •  5
  •   Asaph    15 年前

    如果你说的是拥有一个动态的列数(即每次添加另一个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 查询中的子句(或者一些战略性复合索引,具体取决于您将如何查询表)。此外,最好将主键列作为每个表的第一列,因为如果需要更新或删除单独的行,它将为您提供唯一的句柄。为了简单地说明我的观点,我省略了上面示例中的主键。

        2
  •  3
  •   Bill Karwin    15 年前

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

        3
  •  1
  •   IrishChieftain    15 年前

    是否需要同时使用/显示所有结果?如果是这样的话,把它们放在一起就更有效了,为此,我只需要一张桌子就可以了:—)