Иерархия отчетов в Mutltiple Tables - PullRequest
0 голосов
/ 23 апреля 2009

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

Я до безумия мучаюсь гигантскими блоками кода «если» с жестко закодированными объединениями и именами таблиц, и я стараюсь распознать какую-то вменяемую причину отказа от использования одной таблицы с levelID в каждой строке вместо одной таблицы для каждого уровня, для всех этих уровней или, по крайней мере, несколько представлений в одной таблице. Последнее потому, что база данных была разработана для использования в MSAccess, что не позволяет использовать псевдонимы с подзапросами AFAIK.

Ответы [ 2 ]

4 голосов
/ 23 апреля 2009

Таблицы одинаковы по семантике или только по форме? Если таблицы идентичны как по форме, так и по семантике, то решение с одной таблицей, вероятно, намного лучше, но я не знаю достаточно о вашем случае, чтобы сказать наверняка.

Представление иерархии в таблице SQL может быть довольно сложной задачей. К счастью, иерархии отчетов, как правило, достаточно малы и достаточно стабильны, поэтому могут работать различные методы.

Самая простая техника называется моделью списка смежности. В этой модели есть два столбца, один из которых относится к другому. Я назову их MyTable (ID, ParentID). В реальном случае Mytable будет иметь другие столбцы. ParentID ссылается на идентификатор в другой строке той же таблицы. Это легко реализовать и легко обновить. Это может быть боль делать свертки.

Другая техника называется «вложенные множества». Назовите это MyTable (ID, lft, rgt, Level). (Уровень избыточен и часто опускается). Здесь у нас есть два столбца (lft и rgt), которые показывают, где строка вписывается в иерархию, потому что lgt и rgt вложены в lft и rgt всех предков рассматриваемого узла. Эту технику сложно обновить. Это легко сделать свертки, найти поддеревья, пути предков и множество других типов запросов.

Третий способ "сгладить иерархию". В этом методе каждый уровень иерархии имеет свой собственный именованный столбец, и каждая строка отображает всю свою родословную вплоть до вершины иерархии. Здесь у нас есть MyTable (ID, отдел, отдел, группа, команда). Отдел, Отдел, Группа и Команда - все уровни иерархии. Это в конечном итоге легко для пользователей, которые получают доступ к данным через интерфейс «укажи и щелкни», поскольку им нечего учиться, если имена столбцов выбраны правильно. Требуется имя для каждого уровня. Он плохо адаптируется к неопределенным уровням иерархии. У него много избыточности. Как правило, плоские иерархии генерируются автоматически из таблицы, в которой хранятся иерархии в форме списка зависимостей или в виде вложенных множеств.

Любая из них является хорошей альтернативой отдельным таблицам для каждого уровня в иерархии.

0 голосов
/ 31 августа 2010

отличные решения предлагаются здесь уже. Я бы добавил один, чтобы использовать иерархическую базу данных, такую ​​как гиперграф.

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