트리 구조는 파일 디렉터리, BBS, 권한 설정, 부서 설정 등과 같은 애플리케이션에서 여전히 매우 일반적입니다. 이러한
데이터
정보는 모두 계층적 구조를 채택하고 있어 현재 관계형 데이터베이스에서는 명확하게 표현하기 어렵습니다. 그렇다면프로그램의 트리 구조 문제를
어떻게 처리할 수 있을까요
?최근 저자는 ASP 권한 관리 프로그램을 통해 이 문제를 쉽게 해결했는데, 이제 독자들을 위해 정리하겠습니다.
첫째, 계층적 데이터 모델을 관계형 데이터 모델로 변환해야 합니다. 즉, ACCESS, SQL SERVER
, ORACLE 및 기타 관계형 데이터베이스에서 이 데이터 구조를 설계하는 방법입니다.
다음 데이터와 같은 예를 들어보겠습니다.
문서 관리 1
|----새 문서 2
|----문서 수정 3
|----문서 보관소 4
|----보관된 정보 보기 5
|----보관된 정보 삭제 6
|----역사문서 삭제 7
|----공문서 삭제 8
|----시스템 관리 9
|----사용자 관리 10
인사관리11
행정 12
Financial Management 13
매우 전형적인 계층구조의 데이터인데, 이를 2차원 테이블 형태로 표현하려면 어떻게 해야 할까요? 처음에는
어려울 것 같죠? 하지만 신중하게 고려한 후에도 여전히 이를 악용할 수 있는 방법이 있습니다.
이런 식으로 위의 모든 권한은 하나의 권한 필드로 간주될 수 있으며, 이 권한 필드에는 ID 값이 있어야 합니다.
그런 다음 이 관계형 데이터 테이블에 다른 필드(이 권한이 속한 권한
수준
, 즉 이 ID 값이 속한 ID 값을 나타내는 하위 ID 필드)를 강제로 추가합니다. 예를 들어 "보관 정보 보기" 권한 ID 값은 "5"이고 "
문서
보관" 권한에 하위인 경우 해당 하위 ID 필드의 값은 "4"여야 합니다.자, 이것이 이해될 수 있다면
우리의
관계 변환 작업은 기본적으로 완료된 것입니다.이 관계형 데이터 테이블 설계를 시작하겠습니다(SQL Server 7.0을 예로 들어).
+------------+-----------+------ --- ---+------------+----------+
| 필드 이름 | 필드 유형 |
+------------+------------+------------+------------+- ---------+
| SelfID | 권한 ID |
| PowerName 권한 이름 |
| 권한 정보 |
| 소속 ID |
+------------+------------+------------+------------+- ---------+
좋습니다. 일단 구조가 설계되면 테스트 데이터를 쉽게 입력할 수 있습니다.
그런 다음 웹 페이지의 계층 구조를 모방하여 이 기능을 사용하여 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 "select * from ownid가 null order by powerid인 powers에서 선택",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>"
'서브루틴 호출, 하위 계층 데이터 처리
ListSubPower(rs("powerid"))
rs.movenext
루프
호출'상위 레이어 데이터 세트 닫기
RS.닫기
rs=아무것도 설정하지 않음
'하위 계층 데이터 처리 서브루틴
Sub ListSubPower(id)
'상위 powerid에 속하는 모든 하위 레이어 데이터 정보를 엽니다.
rs_sub=Server.CreateObject("ADODB.Recordset")를 설정합니다.
rs_sub.Open "select * from powers where ownid=" & id & " order by powerid",conn,1,3
'열 하위 계층 데이터
do while not rs_sub.eof
'레벨 번호 표현 변수 점진적 누적
format_i=format_i+1
'루프 들여쓰기 형식 제어, 최상위 및 두 번째 수준에서는 들여쓰기가 필요하지 않으므로 이 프로그램 세그먼트는 세 번째 수준에서 참조됩니다.
i=format_i에서 3단계 -1로
응답.쓰기 "|"
응답.쓰기 " "
next
'하위 레이어 데이터 정보 출력
응답.쓰기 " |----"
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
loop
'레벨 수는 변수가 점진적으로 감소하고 있음을 나타냅니다.
format_i=format_i-1
'하위 레이어 데이터 세트 닫기
rs_sub.close
rs_sub=아무것도 설정하지 않음
서브 끝
%>
powerlist.asp 프로그램에서 먼저 최상위 데이터를 열고 이를 루프에 표시한 다음, 루프를 통해 호출되는 서브루틴 ListSubPower를 설계합니다. 서브루틴의 레이어 데이터 정보를 열고 서브루틴의 내부 루프에서 자신을 반복적으로 호출하여 레이어별로 심층 데이터를 확장하는 재귀 알고리즘입니다.
또한 들여쓰기 표시 형식을 제어하기 위해 프로그램에서 정적 변수 format_i가 사용됩니다.
이 글은 트리 구조에서 데이터 디자인과 프로그램 제어에 대한 간단한 시도를 합니다. 독자들이 이 글을 통해 더 많은 영감을 얻을 수 있기를 바랍니다.