Признание иерархии нескольких родителей - PullRequest
1 голос
/ 31 октября 2011
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 Ответ

4 голосов
/ 31 октября 2011

Используя ваши примеры данных, я на самом деле получаю другое дерево ...

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

Вы действительно хотите два независимых дерева? Если это так, вы можете ввести дополнительное поле, например идентификатор дерева ...

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

Что может потребоваться для вас, чтобы описать ситуацию в реальном мире, именно то, что вы хотите от нее, и то, что вы не хотите от нее.


Мой типичный опыт заключается в том, что для целей отчетности любой узел в дереве должен иметь только одного родителя, но может иметь много дочерних элементов. Это означает, что при подъеме по дереву у вас есть только один маршрут, а при спуске по дереву данные разделяются на подузлы.

Наличие многих родителей и многих детей создает сеть, а не дерево Где у вас есть несколько маршрутов, независимо от того, в каком направлении вы проходите дерево.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...