Estruturas em árvore ainda são muito comuns em nossas aplicações, como diretórios de arquivos, BBS, configurações de permissão, configurações de departamento, etc.
Todasessas informações
de dados
adotam uma estrutura hierárquica, que é difícil de expressar claramente em nosso banco de dados relacional atual. Então,como lidar
com problemas de estrutura em árvore no programa
?Recentemente, o autor resolveu facilmente esse problema por meio de um programa de gerenciamento de direitos ASP, e agora vou resolver isso para os leitores.
Primeiro, o modelo de dados hierárquico deve ser convertido em um modelo de dados relacional. Em outras palavras, como projetar essa estrutura de dados em nossos bancos de dados ACCESS, SQL SERVER
, ORACLE e outros bancos de dados relacionais.
Vejamos um exemplo, como os seguintes dados:
Gestão Documental 1
|----Novo documento 2
|----Modificação do documento 3
|----Arquivo de Documentos 4
|----Ver informações arquivadas 5
|----Excluir informações arquivadas 6
|----Excluir documentos históricos 7 |
|----Excluir documento oficial 8 |
|----Gerenciamento do Sistema 9
|----Gerenciamento de usuários 10
Gestão de Pessoal 11
Administração 12
Gestão Financeira 13
Esta é uma estrutura hierárquica de dados muito típica, então pense bem, como expressá-la na forma de uma tabela bidimensional?
Parece difícilno começo
, certo? Mas após uma consideração cuidadosa, ainda há uma maneira de explorá-lo.
Desta forma, todas as permissões acima podem ser consideradas como um campo de permissão, então este campo de permissão deve ter um valor de ID.
Em seguida,
adicionamos
à força outro campo a esta tabela de dados relacionais - o campo ID subordinado, que indica a qual nível de permissão essa permissão pertence, ou seja, a qual valor de ID esse valor de ID pertence. Por exemplo: o valor do ID da permissão "Visualizar informações do arquivo" é "5" e está subordinado à permissão "Arquivamento
de documentos
", então o valor do campo de ID subordinado deve ser "4".OK, se isso puder ser entendido, então
nosso
trabalho de transformação de relacionamento está basicamente concluído.Vamos começar a projetar esta tabela de dados relacionais (tomando o Sql Server 7.0 como exemplo):
+-----------+-----------+----- --- ---+-----------+----------+
| Nome do campo | Significado do campo | Tamanho do campo |
+-----------+-----------+-----------+-----------+- ---------+
|AutoID | ID de permissão |
| Nome da permissão | Varchar |
Informações de permissão |
|PertenceID |Pertence ID |
+-----------+-----------+-----------+-----------+- ---------+
Ok, uma vez projetada a estrutura, você pode inserir facilmente seus dados de teste.
A seguir, focaremos em como imitar a estrutura hierárquica na página web para exibir o programa ASP com esta função. Esta também é a etapa mais crítica.
Lista de programas: powerlist.asp
<%
'Conexão com banco de dados
definir conn=Server.CreateObject("ADODB.Connection")
conn.open "driver={SQL Server};server=chaiwei;DATABASE=chaiwei;UID=sa;PWD="
'Abre todos os dados da camada pai
definir rs=Server.CreateObject("ADODB.Recordset")
rs.Open "selecione * das potências onde pertencer é ordem nula por powerid",conn,1,3
'Atribuir valor inicial à variável de expressão de número de nível
format_i=1
'Listar a seção principal do programa
do while not rs.eof
'Imprime informações de dados da camada pai
response.write "<a href='powerlist.asp?SelfID=" & rs("powerid") & "&BelongID=" & rs("belongid") & "'>" & rs("powername") & "< /a>"
response.write "<br>"
'Chamada de subrotina, processamento de dados de subcamada
Chame ListSubPower(rs("powerid"))
rs.movenext
loop
'Fecha o conjunto de dados da camada pai
rs.fechar
definir rs = nada
'Sub-rotina de processamento de dados da subcamada
Sub ListSubPower(id)
'Abre todas as informações de dados da subcamada pertencentes ao powerid superior
definir rs_sub=Server.CreateObject("ADODB.Recordset")
rs_sub.Open "selecione * dos poderes onde pertencer = "& id & "ordenar por powerid", conn,1,3
'Dados da subcamada da coluna
do while not rs_sub.eof
'Número de nível expressão variável acumulação progressiva
format_i=format_i+1
'Controle de formato de recuo de loop, porque os níveis superior e segundo não requerem recuo, então este segmento do programa é referenciado a partir do terceiro nível
para i=format_i para 3 passo -1
resposta.write "|"
resposta.write " "
próximo
'Imprimir informações de dados da subcamada
resposta.write " |----"
response.write "<a href='powerlist.asp?SelfID=" & rs_sub("powerid") & "&BelongID=" & rs_sub("belongid") &"'>" & rs_sub("powername") & "< /a>"
response.write "<br>"
'Chama recursivamente a própria sub-rotina para processar gradualmente os dados da subcamada
ListSubPower(rs_sub("powerid"))
rs_sub.movenext
loop
'O número de níveis indica que a variável está diminuindo progressivamente
format_i=format_i-1
'Fecha o conjunto de dados da subcamada
rs_sub.fechar
definir rs_sub = nada
Finalizar sub
%>
No programa powerlist.asp, primeiro abrimos os dados de nível superior e os exibimos no loop, em seguida, projetamos uma sub-rotina ListSubPower, que é chamada no loop por meio de um; algoritmo recursivo para abrir as informações de dados da camada de sub-rotina e chama-se repetidamente no loop interno da sub-rotina para expandir os dados profundos camada por camada.
Além disso, uma variável estática format_i é usada no programa para controlar o formato de exibição do recuo.
Este artigo faz uma tentativa simples de design de dados e controle de programa na estrutura em árvore. O objetivo é inspirar outras pessoas.