多个父级层次结构递归

时间:2011-10-31 11:12:59

标签: sql database-design ssas

Master Table
===========
ID NAME
1   A
2   B
3   C
4   D
5   E

具有多个父项的层次结构表(请注意,由于重复值,两者都不能是主列)

Relations Table
================
ChildID ParentID  
   3        1
   3        2
   4        3
   4        2
   5        4

层次结构变得像(它可能不一直是线性的):

  1         2
  |         |
  3         3
  |         |
  4         4
  |         |
  5         5

问题:

出于报告目的,我需要递归层次结构格式的数据,以便我可以向下钻取它。如果我可以从现有数据本身获取向下钻取功能,我就没有得到(似乎不可行,因为由于重复的值,我无法创建递归的父子关系)

任何想法? 我的目标是最终将此结构用作SSAS中的维度,如果表具有自主键 - 子键关系,则会自动向下钻取。

1 个答案:

答案 0 :(得分:4)

使用您的示例数据,我实际上得到了另一棵树......

Relations Table            Tree
================          =======
ChildID ParentID           1   2
   3        1               \ /|
   3        2                3 |
   4        3                 \|
   4        2                  4
   5        4                  |
                               5

你真的想要两棵独立的树吗?如果是这种情况,您可以引入额外的字段,例如树ID ...

Relations Table              Tree1     Tree2
=======================      =====     =====
TreeID ParentID ChildID        
   1     NULL      1           1         2
   1      1        3           |         |
   1      3        4           3         3
   1      4        5           |         |
   2     NULL      2           4         4
   2      2        3           |         |
   2      3        4           5         5
   2      4        5

如果没有一些额外的信息,你将总是遇到分支拆分和合并的问题,而没有一套非常好的约束条件。例如,如果您想要两个1-3-4-5和2-3-4-6的线性树,那么您当前的模型将具有此...

Relations Table            Tree
================          =======
ParentID ChildID           1   2
   1        3               \ /
   2        3                3 
   3        4                |
   4        5                4
   4        6               / \
                           5   6

你现在遇到的问题是,有四条线性路径......
- 1-3-4-5
- 1-3-4-6
- 2-3-4-5
- 2-3-4-6

您可能需要描述一个真实世界的情况,正是您想要的东西,以及您不想要的东西。


我的典型经验是,出于报告目的,树中的任何节点应该只有一个父节点,但可能有很多子节点。这意味着爬树时只有一条路线,爬下树时,数据会分成子节点。

有许多父母和许多孩子会成为一个网而不是一棵树。你有多条路线的地方,无论你走遍树的方向。