代码之家  ›  专栏  ›  技术社区  ›  Chepech

甲骨文的速度有多快?树形结构的小桌子与巨大的平板桌子

  •  4
  • Chepech  · 技术社区  · 14 年前

    甲骨文公司 ,我们有这个 部门层次结构 我们需要在数据库中映射。有些事情看起来是这样的(我很确定你们都知道我在说什么,但我会包括一个ERD,以防万一):

    alt text

    因此它将存储如下所示的数据:

    [1 | 0]
    [2 | 1]
    [3 | 2]
    [4 | 2]
    

    换句话说:

    Department 1
         |__Department 2
                 |___Department 3
                 |___Department 4
    

    CONNECT BY 指挥部,每个部门只有一个记录员。我们通常采用这种树结构作为解决方案,但是在这个新的应用程序中,性能是一个关键因素,所以我想知道如果我有一个扁平的表,它会是这样的。

    [1 | 0]
    [2 | 1]
    [3 | 1]
    [3 | 2]
    [4 | 1]
    [4 | 2]
    

    这允许您拥有非常明显的关系,而不必知道父部门,就可以让给定的子部门知道他们的上级部门是谁。但是这增加了所需的数据量,因为您需要一个部门所处的每个级别的记录,这意味着如果一个部门的级别比最高级别低15个级别,我们将需要15个记录。 这个部门相当大,所以最终可能会成为一个巨大的表格(大约200万条记录)。

    好吧,那么在简单介绍之后,这就是问题所在;有没有人真正尝试过这样一种方法,能够告诉我在这两个选项(巨大的平面表或小树形表)之间,DB的速度/成本是什么?

    4 回复  |  直到 14 年前
        1
  •  7
  •   dcp    14 年前

    我肯定会选择第一种方法(层次方法)。我认为正确地建模数据比仅仅使用一个糟糕的数据模型来获得性能要好。因为您正在这里建模一个层次结构,所以将它以这种方式存储在数据库中是有意义的。

    materialized view 为了“扁平化”层次数据,您仍然可以正确地存储数据,但是通过使用物化视图可以获得性能提升(如果有的话)。

    几乎总有一种方法可以遵循一个好的数据模型,并且仍然可以找到获得良好性能的方法。但是 一个糟糕的数据模型将花费你数年的时间,以后要纠正它需要极大的痛苦

    然而,即使使用扁平化方法,您也必须考虑显著增加记录的数量,特别是当您到达树中的叶节点时,因此如果使用扁平层次结构表(第二种方法)会提高性能,我会感到惊讶,因为有更多的记录要处理。

        2
  •  2
  •   dovka    13 年前

    快速访问分层数据的另一种方法是 嵌套集合 数据模型:

    Nested Set on Wiki

    它允许您对所有子节点进行单通道访问, 不管深度如何,可能需要离线维护,

        3
  •  0
  •   Novikov    14 年前

    如果需要读取性能,请尝试路径枚举。

    [1 | 0]
    [2 | 1]
    [3 | 2]
    [4 | 2]
    

    [1 | '0']
    [2 | '0.1']
    [3 | '0.1.2']
    [4 | '0.1.2']
    

    SELECT * FROM dept WHERE path LIKE '0.1.2%'
    

    当然,这是规范化和性能之间的折衷。

        4
  •  0
  •   Charles Bretana    14 年前

    对于类似部门的情况,不可能在表中有足够的记录,以解决性能问题。别担心。