Древовидные структуры по-прежнему очень распространены в наших приложениях, например, каталоги файлов, BBS, настройки разрешений, настройки отделов и т. д.
Всеэти
данные
имеют иерархическую структуру, которую трудно четко выразить в нашей текущей реляционной базе данных. Таккак же решить
проблемы с древовидной структурой в программе
?Недавно автор легко решил эту проблему через программу управления правами ASP, и теперь я разберу ее для читателей.
Во-первых, иерархическую модель данных необходимо преобразовать в реляционную модель данных. Другими словами, как спроектировать эту структуру данных в наших ACCESS, SQL SERVER
, ORACLE и других реляционных базах данных.
Давайте возьмем пример, например следующие данные:
Управление документами 1
|----Новый документ 2
|----Модификация документа 3
|----Архив документов 4
|----Просмотреть архивную информацию 5 |
|----Удалить архивную информацию 6 |
|----Удалить исторические документы 7 |
|----Удалить официальный документ 8 |
|----Системное управление 9
|----Управление пользователями 10
Управление персоналом 11
Администрация 12
Финансовый менеджмент 13
Это очень типичная иерархическая структура данных, поэтому задумайтесь, как выразить ее в виде двумерной таблицы? Поначалу
это кажется трудным, правда? Но после тщательного рассмотрения все же есть способ использовать это.
Таким образом, все вышеперечисленные разрешения можно рассматривать как одно поле разрешений, тогда это поле разрешений должно иметь значение идентификатора.
Затем
мы
принудительно добавляем в эту таблицу реляционных данных еще одно поле — подчиненное поле ID, которое указывает, какому уровню разрешения принадлежит это разрешение, то есть какому значению ID принадлежит это значение ID. Например: значение идентификатора разрешения «Просмотр архивной информации» равно «5», и оно подчинено разрешению «Архивация
документов
», тогда значение его подчиненного поля идентификатора должно быть «4».Хорошо, если это можно понять, то
наша
работа по трансформации отношений в основном завершена.Давайте начнем проектировать эту реляционную таблицу данных (на примере Sql Server 7.0):
+-----------+-----------+----- --- ---+-----------+----------+
| Имя поля | Значение поля | Тип поля | Атрибуты поля |
+-----------+-----------+-----------+-----------+- ---------+
| SelfID | Идентификатор разрешения | Int |
| ИмяПравления | Имя разрешения | Varchar 50 |
| Информация о разрешениях |
|Идентификатор принадлежности |Int |
+-----------+-----------+-----------+-----------+- ---------+
Хорошо, как только структура спроектирована, вы можете легко ввести тестовые данные.
Затем мы сосредоточимся на том, как имитировать иерархическую структуру веб-страницы для отображения программы ASP с помощью этой функции. Это также наиболее важный шаг.
Список программ: powerlist.asp
<%
'Подключение к базе данных
set conn=Server.CreateObject("ADODB.Connection")
conn.open "driver={SQL Server};server=chaiwei;DATABASE=chaiwei;UID=sa;PWD="
'Открыть все данные родительского слоя
set rs=Server.CreateObject("ADODB.Recordset")
rs.Open "выбрать * из степеней, где принадлежит id имеет нулевое значение, порядок по powerid", conn,1,3
'Назначить начальное значение переменной выражения номера уровня
format_i=1
'Перечислить основной раздел программы
do while not rs.eof
'Распечатать информацию о данных родительского слоя
response.write "<a href='powerlist.asp?SelfID=" & rs("powerid") & "&BelongID=" & rs("belongid") & "'>" & rs("powername") & "< /а>"
response.write "<br>"
'Вызов подпрограммы, обработка данных подуровня
Call ListSubPower(rs("powerid"))
rs.movenext
цикл
'Закрываем набор данных родительского слоя
RS.закрыть
установить rs=ничего
'Подпрограмма обработки данных подуровня
Sub ListSubPower(id)
'Открывает всю информацию о данных подуровня, принадлежащую верхнему идентификатору мощности.
set rs_sub=Server.CreateObject("ADODB.Recordset")
rs_sub.Open "выбрать * из полномочий, где принадлежат ID=" & id & "упорядочить по powerid",conn,1,3
'Данные подслоя столбца
do while not rs_sub.eof
'Прогрессивное накопление переменной выражения номера уровня
format_i=format_i+1
'Цикл управления форматом отступов, поскольку верхний и второй уровни не требуют отступов, поэтому на этот сегмент программы ссылаются с третьего уровня
для i=format_i до 3 шага -1
ответ.пишите "|"
ответ.напишите " "
следующий
'Распечатать информацию о данных подслоя
ответ.пишите " |----"
response.write "<a href='powerlist.asp?SelfID=" & rs_sub("powerid") & "&BelongID=" & rs_sub("belongid") &"'>" & rs_sub("powername") & "< /а>"
response.write "<br>"
'Рекурсивно вызывать саму подпрограмму для постепенной обработки данных подуровня
ListSubPower(rs_sub("powerid"))
rs_sub.movenext
цикл
'Количество уровней указывает на то, что переменная постепенно уменьшается
format_i=format_i-1
'Закрываем набор данных подслоя
rs_sub.close
установить rs_sub=ничего
Конец субтитра
%>
В программе powerlist.asp мы сначала открываем данные верхнего уровня и отображаем их в цикле, затем создаем подпрограмму ListSubPower, которая вызывается в цикле через a; рекурсивный алгоритм для открытия информации о данных слоя подпрограммы и неоднократно вызывает себя во внутреннем цикле подпрограммы для расширения глубоких данных слой за слоем.
Кроме того, в программе используется статическая переменная format_i для управления форматом отображения отступов.
В этой статье делается простая попытка проектирования данных и управления программами в древовидной структуре. Я надеюсь, что читатели смогут получить больше вдохновения от этой статьи.