hel*_*rld 1 sql ssas database-design
Master Table
===========
ID NAME
1 A
2 B
3 C
4 D
5 E
Run Code Online (Sandbox Code Playgroud)
具有多个父级的层次结构表(请注意,由于重复值,两者都不能成为主列):
Relations Table
================
ChildID ParentID
3 1
3 2
4 3
4 2
5 4
Run Code Online (Sandbox Code Playgroud)
层次结构变得像(它可能并不总是这样线性):
1 2
| |
3 3
| |
4 4
| |
5 5
Run Code Online (Sandbox Code Playgroud)
出于报告目的,我需要递归层次结构格式的数据,以便我可以深入了解它。我不知道是否可以从现有数据本身获取向下钻取功能(似乎不可行,因为由于重复值,我无法创建递归父子关系)。
你有什么想法?我的目标是最终使用这个结构作为 SSAS 中的一个维度,如果表具有自主键-子键关系,它会自动提供向下钻取。
使用您的示例数据,我实际上得到了一棵不同的树......
Relations Table Tree
================ =======
ChildID ParentID 1 2
3 1 \ /|
3 2 3 |
4 3 \|
4 2 4
5 4 |
5
Run Code Online (Sandbox Code Playgroud)
你真的想要两棵独立的树吗?如果是这种情况,您可以引入一个额外的字段,例如树 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
Run Code Online (Sandbox Code Playgroud)
如果没有一些额外的信息,您总是会遇到分支分裂和合并的问题,而没有一组非常完善的约束。例如,如果您想要 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
Run Code Online (Sandbox Code Playgroud)
但你现在遇到的问题是,有四个线性路径...
- 1-3-4-5
- 1-3-4-6
- 2-3-4-5
- 2-3-4-6
您可能需要描述一个现实世界的情况,准确地描述您想要从中得到什么,以及准确地描述您不想要从中得到什么。
我的典型经验是,出于报告目的,树中的任何节点都应该只有一个父节点,但可能有许多子节点。这意味着当爬上一棵树时,你只有一条路线,而当爬下一棵树时,数据会分成子节点。
有许多父母和许多孩子会形成一张网,而不是一棵树。无论您从哪个方向遍历树,都有多条路线。